我对
static root
感到困惑,想澄清一些事情。
要在 Django 中提供静态文件,以下内容应位于
settings.py
和 urls.py
中:
import os
PROJECT_DIR=os.path.dirname(__file__)
STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')
STATIC_URL = '/static/'
STATICFILES_DIRS = ( os.path.join(PROJECT_DIR,'static/'),)
...并在
urls.py
中添加以下几行:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += patterns('', (
r'^static/(?P<path>.*)$',
'django.views.static.serve',
{'document_root': settings.STATIC_ROOT}
))
python manage.py collectstatic
问题:
有人可以向我解释一下工作流程吗:理想情况下应该如何完成事情。截至目前,我将上述代码片段复制/粘贴到指定位置,并继续在静态目录中创建新文件,它就可以工作了。然而,在我的
settings.STATIC_ROOT
中,我指向了另一个目录。 如果有人能够解释每个设置的工作流程:如何收集和管理文件,以及遵循什么是好的做法,那就太好了。
谢谢。
将收集用于部署的静态文件的目录的绝对路径。 示例:./manage.py collectstatic
STATIC_ROOT="/var/www/example.com/static/"
现在命令
./manage.py collectstatic
会将所有静态文件(即应用程序中的静态文件夹中的静态文件,所有路径中的静态文件)复制到目录/var/www/example.com/static/
。现在你只需要在 apache 或 nginx 等上提供这个目录。
,其中URL
目录中的静态文件由Apache或nginx..等提供服务。 示例:STATIC_ROOT
或/static/
http://static.example.com/
如果您设置了
STATIC_URL = 'http://static.example.com/'
,那么您必须通过apache或nginx在urlSTATIC_ROOT
处提供"/var/www/example.com/static/"
文件夹(即'http://static.example.com/'
)(以便您可以使用'/var/www/example.com/static/jquery.js'
引用静态文件'http://static.example.com/jquery.js'
)
现在在你的 django-templates 中,你可以通过以下方式引用它:
{% load static %}
<script src="{% static "jquery.js" %}"></script>
将渲染:
<script src="http://static.example.com/jquery.js"></script>
STATICFILES_DIRS
:您可以在此处保留项目的静态文件,例如您的模板使用的那些。
STATIC_ROOT
:将其留空,当您执行manage.py collectstatic
时,它将搜索系统上的所有静态文件并将它们移动到此处。您的静态文件服务器应该映射到该文件夹,无论它位于何处。运行collectstatic后查看,你会发现django已经建立了目录结构。
--------编辑----------------
正如 @DarkCygnus 所指出的,STATIC_ROOT 应该指向文件系统上的一个目录,该文件夹应该为空,因为它将由 Django 填充。
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
或
STATIC_ROOT = '/opt/web/project/static_files'
--------编辑结束-----------------
STATIC_URL
:'/static/'通常没问题,它只是静态文件的前缀。
首先,我解释一下“STATIC_ROOT”,然后解释“STATIC_URL”。
STATIC_ROOT
可以设置一个文件夹路径,与下面的命令一起使用,将 Django 项目中的 apps 和 admin 的静态文件收集到该文件夹路径中。 *STATIC_ROOT
永远不会影响STATIC_URL
:
python manage.py collectstatic
现在,我们有一个django项目,其中“core”文件夹中的静态文件“core.js”,其中“settings.py”和“myapp”文件夹中的“myapp.css”,这是一个应用程序”如下图:
以及“venv”文件夹中“admin”文件夹中的“css”、“fonts”、“img”和“js”文件夹,如下所示。 *我在这个 django 项目中使用名为“venv”的虚拟环境,因此 “admin”的静态文件在其中,并且 “admin”文件夹的相对路径是 “venv/lib/python3.8/站点包/django/contrib/admin/static/admin":
然后,我们将 “os.path.join(BASE_DIR, 'static')”
设置为“STATIC_ROOT”,在我的例子中,Windows 中的 “C:\Users\kai\django-project\static” 。此外,我们将 “False” 设置为 “DEBUG”,因为 “STATIC_ROOT” 仅适用于 生产模式,正如我之前所说:
# "core/settings.py"
DEBUG = False // Production Mode
STATIC_ROOT = os.path.join(BASE_DIR, 'static') // Here
STATIC_URL = '/static/'
python manage.py collectstatic
然后,创建
“static”文件夹,并收集“admin”文件夹中的
“css”、“fonts”、“img”和“js”文件夹以及“myapp”文件夹中的“myapp.css”进入“static”文件夹,如下所示,但正如我们所见,“core”文件夹中的“core.js”没有收集到“static”文件夹,如下所示,因为正如我之前所说,命令“python manage.pycollectstatic”从 django 项目中的应用程序和管理员收集静态文件,但具有“settings.py”的“core”文件夹不是应用程序和管理员。这就是为什么“core”文件夹中的“core.js”没有收集到“static”文件夹中:
但是,有一种方法可以将“core”文件夹中的“core.js”收集到“static”文件夹
中。为此,我们需要使用"STATICFILES_DIRS" 然后设置 os.path.join(BASE_DIR, 'core/static')" 即 "C:\Users\kai\django-projec