Django中的STATIC_ROOT和STATIC_URL
我对 static root
有点困惑,想弄清楚一些事情。
在 Django 中,要提供静态文件,需要在 settings.py
和 urls.py
中做以下设置:
import os
PROJECT_DIR=os.path.dirname(__file__)
1. 静态文件应该收集到的目录的绝对路径
STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')
2. 静态文件的 URL 前缀
STATIC_URL = '/static/'
3. 其他静态文件的位置
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}
))
4. 我们还需要使用 python manage.py collectstatic
问题:
有没有人能给我解释一下工作流程:理想情况下应该怎么做。目前,我只是把上面的代码片段复制粘贴到指定的位置,然后继续在静态目录中创建新文件,这样就能正常工作。不过在我的
settings.STATIC_ROOT
中,我指向了一个不同的目录。如果有人能解释一下每个设置的工作流程:文件是如何收集和管理的,以及应该遵循什么好的实践,那就太好了。
谢谢。
5 个回答
2023年8月更新:
首先,我来解释一下 STATIC_ROOT,然后是 [STATIC_URL2。
<STATIC_ROOT>
STATIC_ROOT
是用来设置一个文件夹路径的,可以通过下面的命令把 Django 项目中应用和管理后台的静态文件收集到这个文件夹里。* STATIC_ROOT
不会影响 STATIC_URL
:
python manage.py collectstatic
而且 STATIC_ROOT
只在生产模式下有效,也就是 DEBUG = False,如下所示:
# "core/settings.py"
DEBUG = False // Production Mode
现在,我们有一个 Django 项目,里面有静态文件 core.js
在 core
文件夹里,settings.py
也在这个文件夹里,还有 myapp.css
在 myapp
文件夹里,这个文件夹是 一个应用,如下所示:
还有 admin
文件夹里的 css
、fonts
、img
和 js
文件夹,这些都在 venv
文件夹里,如下所示。*我为这个 Django 项目使用了名为 venv
的虚拟环境,所以管理后台的静态文件在这个环境里,admin
文件夹的相对路径是 venv/lib/python3.8/site-packages/django/contrib/admin/static/admin/
:
然后,我们将 BASE_DIR / 'static/'
设置为 C:\Users\kai\django-project\static
(在我的 Windows 系统中)作为 STATIC_ROOT
。另外,我们将 DEBUG = False
,因为 STATIC_ROOT
只在 生产模式 下有效,如我之前所说:
# "core/settings.py"
DEBUG = False // Production Mode
STATIC_ROOT = BASE_DIR / 'static/' # Here
STATIC_URL = 'static/'
现在,我们运行下面的命令:
python manage.py collectstatic
然后,static
文件夹被创建,admin
文件夹里的 css
、fonts
、img
和 js
文件夹,以及 myapp.css
都被收集到 static
文件夹里,如下所示。但如我们所见,core.js
在 core
文件夹里并没有被收集到 static
文件夹,因为正如我之前所说,命令 python manage.py collectstatic
只会收集 Django 项目中应用和管理后台的静态文件,而 core
文件夹(包含 settings.py
)并不是一个应用或管理后台。这就是为什么 core.js
没有被收集到 static
文件夹的原因:
不过,有办法把 core.js
收集到 static
文件夹。为此,我们需要在 settings.py
中将 BASE_DIR / 'core/static/'
(在我的 Windows 系统中是 C:\Users\kai\django-project\core\static
)设置为 STATICFILES_DIRS,如下所示:
# "core/settings.py"
DEBUG = False
STATICFILES_DIRS = [ # Here
BASE_DIR / 'core/static/'
]
STATIC_ROOT = BASE_DIR / 'static/'
STATIC_URL = 'static/'
或者,我们需要将 core
添加到 INSTALLED_APPS 中,如下所示:
# "core/settings.py"
DEBUG = False
INSTALLED_APPS = [
'core', # Here
]
现在再次运行下面的命令:
python manage.py collectstatic
然后,输入 yes
并按 Enter 键来覆盖现有的 static
文件夹:
您请求在设置中指定的目标位置收集静态文件:
C:\Users\kai\django-project\static
这将覆盖现有文件!您确定要这样做吗?
输入 'yes' 继续,或输入 'no' 取消:yes
现在,core.js
在 core
文件夹里被收集到 static
文件夹里,如下所示:
<STATIC_URL>
接下来,我来解释一下 STATIC_URL
。
STATIC_URL
是用来设置静态文件 URL 的前半部分,它位于主机部分和文件部分之间,如下所示。* STATIC_URL
不会影响 STATIC_ROOT
:
| Host | Directory | File |
| |Front | Back | |
<-------------> <----> <-------> <------>
https://www.example.com/static/admin/css/base.css
例如,我们在 settings.py
中将 'static/'
设置为 STATIC_URL
,如下所示。* STATIC_URL
在 开发模式(DEBUG = True
)和 生产模式(DEBUG = False
)下都有效:
# "core/settings.py"
DEBUG = False
STATICFILES_DIRS = [
BASE_DIR / 'core/static/'
]
STATIC_ROOT = BASE_DIR / 'static/'
STATIC_URL = 'static/' # Here
然后,打开 Django 管理后台:
接着,按 F12 打开 开发者工具,查看当前打开的 Django 管理页面所用的资源,从 源 中可以看到我们刚刚收集到 static
文件夹里的管理后台静态文件:
然后,将鼠标悬停在 base.css
上以检查 URL:
如我们所见,我们可以设置前半部分为 static
:
Here
<------>
http://localhost:8000/static/admin/css/base.css
而下面这个 URL 是在 www.example.com
和 https
的情况下:
Here
<------>
https://www.example.com/static/admin/css/base.css
我们还可以将前半部分 static
改为 hello/world
。
所以,只需将 STATIC_URL
从 'static/'
改为 'hello/world/'
,如下所示:
# "core/settings.py"
DEBUG = False
STATICFILES_DIRS = [
BASE_DIR / 'core/static/'
]
STATIC_ROOT = BASE_DIR / 'static/'
STATIC_URL = 'hello/world/' # Here
然后,刷新 Django 管理页面:
这样,前半部分 static
就变成了 hello/world
,如下所示:
Here
<----------->
http://localhost:8000/hello/world/admin/css/base.css
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
这是一个绝对路径,指的是用命令
./manage.py collectstatic
收集静态文件后,存放这些文件的地方。 举个例子:STATIC_ROOT="/var/www/example.com/static/"
当你运行命令 ./manage.py collectstatic
时,它会把所有的静态文件(比如你应用中的静态文件,或者其他路径下的静态文件)都复制到 /var/www/example.com/static/
这个文件夹里。之后,你只需要通过 Apache 或 Nginx 等服务器来提供这个文件夹的内容就可以了。
STATIC_URL
这是一个
URL
,用来访问STATIC_ROOT
目录中的静态文件(通过 Apache 或 Nginx 等服务器提供)。 举个例子:/static/
或http://static.example.com/
如果你设置 STATIC_URL = 'http://static.example.com/'
,那么你必须通过 Apache 或 Nginx 在 'http://static.example.com/'
这个地址提供 STATIC_ROOT
文件夹(也就是 "/var/www/example.com/static/"
)。这样,你就可以通过 'http://static.example.com/jquery.js'
来访问 '/var/www/example.com/static/jquery.js'
这个静态文件。
现在在你的 Django 模板中,你可以这样引用:
{% load static %}
<script src="{% static "jquery.js" %}"></script>
这将会渲染成:
<script src="http://static.example.com/jquery.js"></script>