Django 中的 STATIC_ROOT 与 STATIC_URL
我对静态根感到困惑,想澄清一下。
要在 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.pycollectstatic
问题:
有人可以向我解释一下工作流程吗:理想情况下事情应该怎样做。截至目前,我将上述代码片段复制/粘贴到指定位置,并继续在静态目录中创建新文件,它就可以工作了。然而,在我的
settings.STATIC_ROOT
中,我指向了另一个目录。如果有人能够解释每个设置的工作流程:如何收集和管理文件,以及遵循什么是好的做法,那就太好了。
谢谢。
I am confused by static root
and want to clarify things.
To serve static files in Django, the following should be in settings.py
and urls.py
:
import os
PROJECT_DIR=os.path.dirname(__file__)
1. Absolute path to the directory in which static files should be collected
STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')
2. URL prefix for static files
STATIC_URL = '/static/'
3. Additional locations for static files
STATICFILES_DIRS = ( os.path.join(PROJECT_DIR,'static/'),)
...and in urls.py
the following lines:
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += patterns('', (
r'^static/(?P<path>.*)
4. We also use python manage.py collectstatic
Questions:
-
Could anyone please explain the workflow to me: how should things ideally be done. As of now, I copy/paste the above code snippets into their designated locations and continue making new files in the static directory and it works. In my settings.STATIC_ROOT
, however, I have pointed to a different directory.
-
It would be great if someone could explain the workflow of each setting: how files are collected and managed, and what would be a good practice to follow.
Thanks.
,
'django.views.static.serve',
{'document_root': settings.STATIC_ROOT}
))
4. We also use python manage.py collectstatic
Questions:
Could anyone please explain the workflow to me: how should things ideally be done. As of now, I copy/paste the above code snippets into their designated locations and continue making new files in the static directory and it works. In my
settings.STATIC_ROOT
, however, I have pointed to a different directory.It would be great if someone could explain the workflow of each setting: how files are collected and managed, and what would be a good practice to follow.
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
静态根
现在命令
./manage.pycollectstatic
将复制所有将静态文件(即应用程序中的静态文件夹中、所有路径中的静态文件)复制到目录/var/www/example.com/static/
中。现在你只需要在 apache 或 nginx 等上提供这个目录。STATIC_URL
如果您设置
STATIC_URL = 'http:// static.example.com/'
,那么您必须通过以下方式提供STATIC_ROOT
文件夹(即"/var/www/example.com/static/"
) url 处的 apache 或 nginx'http://static.example.com/'
(以便您可以引用静态文件'/var/www/example.com/static/jquery.js'
和'http://static.example.com/jquery.js'
)现在在您的 django-templates 中,您可以通过以下方式引用它:
它将呈现:
STATIC_ROOT
now the command
./manage.py collectstatic
will copy all the static files(ie in static folder in your apps, static files in all paths) to the directory/var/www/example.com/static/
. now you only need to serve this directory on apache or nginx..etc.STATIC_URL
If you set
STATIC_URL = 'http://static.example.com/'
, then you must serve theSTATIC_ROOT
folder (ie"/var/www/example.com/static/"
) by apache or nginx at url'http://static.example.com/'
(so that you can refer the static file'/var/www/example.com/static/jquery.js'
with'http://static.example.com/jquery.js'
)Now in your django-templates, you can refer it by:
which will render:
STATICFILES_DIRS
:您可以在此处保留项目的静态文件,例如模板使用的文件。STATIC_ROOT
:将其留空,当您执行manage.pycollectstatic
时,它将搜索系统上的所有静态文件并将它们移动到此处。您的静态文件服务器应该映射到该文件夹,无论它位于何处。运行collectstatic后检查一下,你会发现django已经构建了目录结构。--------编辑----------------
正如@DarkCygnus所指出的,STATIC_ROOT应该指向文件系统上的一个目录,该文件夹应该是空的,因为它会由 Django 填充。
或
--------结束编辑 -----------------
STATIC_URL
: '/static/' 通常没问题,它只是静态文件的前缀。STATICFILES_DIRS
: You can keep the static files for your project here e.g. the ones used by your templates.STATIC_ROOT
: leave this empty, when you domanage.py collectstatic
, it will search for all the static files on your system and move them here. Your static file server is supposed to be mapped to this folder wherever it is located. Check it after running collectstatic and you'll find the directory structure django has built.--------Edit----------------
As pointed out by @DarkCygnus, STATIC_ROOT should point at a directory on your filesystem, the folder should be empty since it will be populated by Django.
or
--------End Edit -----------------
STATIC_URL
: '/static/' is usually fine, it's just a prefix for static files.2023 年 8 月更新:
首先,我解释一下 STATIC_ROOT,然后 [STATIC_URL2。
STATIC_ROOT
可以设置一个文件夹路径,与下面的命令一起使用,将 Django 项目中的 apps 和 admin 的静态文件收集到该文件夹路径中。 *STATIC_ROOT
永远不会影响STATIC_URL
:并且
STATIC_ROOT
仅适用于生产模式,即 DEBUG = False 如下所示:现在,我们有一个包含静态文件的 django 项目
core.js
位于core
文件夹中,其中settings.py
位于myapp
中code> 文件夹,它是应用程序,如下所示:和
css
、字体
、<venv
文件夹中admin
文件夹中的 code>img 和js
文件夹如下所示。 *我为此 django 项目使用名为 venv 的虚拟环境,因此 admin 的静态文件位于其中,并且 admin 文件夹的相对路径为 venv/lib/ python3.8/site-packages/django/contrib/admin/static/admin/:<图像src="https://i.sstatic.net/ThKL0.png" alt="在此处输入图像描述">
然后,我们设置
BASE_DIR / 'static/'
,即 <在我的例子中,Windows 上的 code>C:\Users\kai\django-project\static 为STATIC_ROOT
。此外,我们设置DEBUG = False
因为STATIC_ROOT
仅适用于生产模式,正如我之前所说:现在,我们运行以下命令:
然后、
static
文件夹已创建,并且css
、fonts
、img
和js
文件夹位于admin
文件夹** 和myapp
文件夹中的myapp.css
被收集到static
文件夹中,如下所示,但我们可以看到,core.js
core 文件夹中的 > 不会收集到static
文件夹中,如下所示,因为正如我之前所说,命令python manage.pycollectstatic
收集静态文件来自 django 项目中的应用程序和管理,但core
文件夹其中有settings.py
不是应用程序和管理员。这就是为什么core
文件夹中的core.js
没有收集到static
文件夹中:但是,有一种方法收集将
core
文件夹中的core.js
复制到static
文件夹中。为此,我们需要在 Windows 上设置BASE_DIR / 'core/static/'
,即C:\Users\kai\django-project\core\static
案例为 STATICFILES_DIRS 中settings.py
如下所示:或者,我们需要将
core
设置为 INSTALLED_APPS insettings.py
如下所示:现在,我们再次运行以下命令:
然后,输入
yes然后按 Enter 覆盖现有
static
文件夹:现在,
core
文件夹中的core.js
被收集到static
文件夹中,如下所示如下所示:接下来,我解释一下
STATIC_URL
。STATIC_URL
可以将静态文件 URL 的前目录部分设置在静态文件 URL 的主机部分和文件部分之间,如下所示。 *STATIC_URL
永远不会影响STATIC_ROOT
:例如,我们在
中将
如下所示。 *'static/'
设置为STATIC_URL
settings.pySTATIC_URL
在开发模式(即DEBUG = True
)和生产模式(即DEBUG = False
:然后,打开 Django Admin:
然后,按F12打开开发者工具从Sources检查当前打开的Django管理页面使用的资源,并且有我们刚刚收集到
static
文件夹中的管理静态文件:然后,将鼠标悬停在
css
中的base.css
以检查 URL:正如我们所见,我们可以设置前面的目录部分
static
:并且,下面的 URL 是
www.example.com
和https
:并且,我们可以更改前面的目录部分
静态
到hello/world
。因此,只需将
STATIC_URL
从'static/'
更改为'hello/world/'
,如下所示:然后,刷新 Django 管理页面:
然后,将前面目录部分
static
改为hello/world
,如下所示:Aug, 2023 Update:
First of all, I explain about STATIC_ROOT, then [STATIC_URL2.
<STATIC_ROOT>
STATIC_ROOT
can set a folder path and be used with the command below which collects the static files of the apps and admin in a Django project into the folder path. *STATIC_ROOT
never ever influence toSTATIC_URL
:And
STATIC_ROOT
only works in Production Mode which is DEBUG = False as shown below:Now, we have a django project with the static files
core.js
incore
folder wheresettings.py
is andmyapp.css
inmyapp
folder which is an app as shown below:And
css
,fonts
,img
andjs
folders inadmin
folder invenv
folder as shown below. *I use the virtual environment namedvenv
for this django project so the static files for admin is in it and the relative path toadmin
folder isvenv/lib/python3.8/site-packages/django/contrib/admin/static/admin/
:Then, we set
BASE_DIR / 'static/'
which isC:\Users\kai\django-project\static
on Windows in my case toSTATIC_ROOT
. In addition, we setDEBUG = False
becauseSTATIC_ROOT
only works in Production Mode as I said before:Now, we run the command below:
Then,
static
folder is created andcss
,fonts
,img
andjs
folders inadmin
folder** andmyapp.css
inmyapp
folder are collected intostatic
folder as shown below but as we can see,core.js
incore
folder is not collected intostatic
folder as shown below because as I said before, the commandpython manage.py collectstatic
collects static files from the apps and admin in a django project butcore
folder which hassettings.py
is not an app and admin. That's whycore.js
incore
folder is not collected intostatic
folder:But, there is a way to collect
core.js
incore
folder intostatic
folder. To do that, we need to setBASE_DIR / 'core/static/'
which isC:\Users\kai\django-project\core\static
on Windows in my case to STATICFILES_DIRS insettings.py
as shown below:Or, we need to set
core
to INSTALLED_APPS insettings.py
as shown below:Now again, we run the command below:
Then, input
yes
then press Enter to overwrite the existingstatic
folder:Now,
core.js
incore
folder is collected intostatic
folder as shown below:<STATIC_URL>
Next, I explain about
STATIC_URL
.STATIC_URL
can set the front directory part of static file URL between the host part and the file part of static file URL as shown below. *STATIC_URL
never ever influenceSTATIC_ROOT
:For example, we set
'static/'
toSTATIC_URL
insettings.py
as shown below. *STATIC_URL
works in both Development Mode which isDEBUG = True
and Production Mode which isDEBUG = False
:Then, open Django Admin:
Then, press F12 to open Developer Tools to check the resources used for the currently opened Django Admin page from Sources and there are the static files for admin which we have just collected into
static
folder:Then, hover
base.css
incss
to check the URL:As we can see, we could set the front directory part
static
:And, this URL below is in this case of
www.example.com
withhttps
:And, we can change the front directory part
static
tohello/world
.So, just change
STATIC_URL
from'static/'
to'hello/world/'
as shown below:Then, refresh the Django Admin page:
Then, the front directory part
static
is changed tohello/world
as shown below:上面的所有答案都有帮助,但没有解决我的问题。在我的生产文件中,我的 STATIC_URL 是
https:///static
并且我在我的 dev settings.py 文件中使用了相同的 STATIC_URL。这会导致 django/conf/urls/static.py 中出现静默失败。
测试
elif 不是 settings.DEBUG 或前缀中的 '://':
选取 URL 中的“//”,但不添加静态 URL 模式,导致找不到静态文件。
如果 Django 吐出一条错误消息,指出您不能使用
http(s)://
和DEBUG = True
我必须将 STATIC_URL 更改为'/静止的/'
All the answers above are helpful but none solved my issue. In my production file, my STATIC_URL was
https://<URL>/static
and I used the same STATIC_URL in my dev settings.py file.This causes a silent failure in django/conf/urls/static.py.
The test
elif not settings.DEBUG or '://' in prefix:
picks up the '//' in the URL and does not add the static URL pattern, causing no static files to be found.
It would be thoughtful if Django spit out an error message stating you can't use a
http(s)://
withDEBUG = True
I had to change STATIC_URL to be '/static/'
在 Django 3.1+ 之后,目录路径的配置略有变化,但概念当然是相同的。
STATICFILES_DIRS
顾名思义,它是一个目录列表。它用于为静态文件指定多个目录。对于应用程序的可重用性而言最有用。每个应用程序都有其独立的目录,而不是为所有静态文件提供一个目录。就像每个单独应用程序的模板一样。
配置应用程序的静态文件目录:
在开发模式下,使用命令
python manage.py runserver
,Django使用STATICFILES_FINDERS
设置搜索静态文件。默认情况下,它尝试在 STATICFILES_DIRS 设置中列出的文件夹中查找请求的静态文件。如果失败,Django 会尝试使用 django.contrib.staticfiles.finders.AppDirectoriesFinder 来查找文件,该文件会在项目中每个已安装应用程序的静态文件夹中查找。STATIC_ROOT
它是 python manage.pycollectstatic 收集用于部署的静态文件的目录的绝对路径。示例:
对于开发来说,没有必要配置
STATIC_ROOT
,但对于生产来说却极其重要。这是Nginx、Apache服务器访问网站静态文件时要考虑的路径。STATIC_URL
引用位于 STATIC_ROOT 中的静态文件时使用的 URL。示例:“static/”或“http://static.example.com/”
现在,假设我决定配置
STATIC_URL='/asset/'
,那么我需要更改STATIC_ROOT=BASE_DIR / 'asset'
并且我的目录名称也应该是asset
。参考:
https://docs.djangoproject.com/en/4.0/ref /contrib/staticfiles/
After Django 3.1+, There is a slight change in the configuration of the directory paths, but the concepts are the same, of course.
STATICFILES_DIRS
As the name suggests, it is a list of directories. It is used for specifying more than one directory for static files. Most useful for the sake of the reusability of an app. Instead of having one directory for all the static files, each app has its independent directory. Just like templates for each individual app.
To configure static files directory of an app:
In development mode, with the command
python manage.py runserver
, Django searches for static files using theSTATICFILES_FINDERS
setting. By default, it tries to find the requested static file in folders listed in the STATICFILES_DIRS setting. In case of failure, Django tries to find the file usingdjango.contrib.staticfiles.finders.AppDirectoriesFinder
, which looks in the static folder of every installed application in the project.STATIC_ROOT
It is the absolute path to the directory where
python manage.py collectstatic
will collect static files for deployment. Example:For development, it is not necessary to configure
STATIC_ROOT
, but extremely important for production. This is the path to be considered by the Nginx, Apache servers to access the website's static files.STATIC_URL
URL to use when referring to static files located in STATIC_ROOT. Example: "static/" or "http://static.example.com/"
Now, suppose I decide to configure the
STATIC_URL='/asset/'
, then I need to changeSTATIC_ROOT=BASE_DIR / 'asset'
and the name of my directory should also beasset
.Reference:
https://docs.djangoproject.com/en/4.0/ref/contrib/staticfiles/