Django 上静态 STATIC_URL 与 STATIC_ROOT 的区别

我被 static root弄糊涂了,想弄清楚一些事情。

要在 Django 中提供静态文件,以下内容应该在 settings.pyurls.py中:

import os
PROJECT_DIR=os.path.dirname(__file__)

收集静态文件的目录的绝对路径

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

问题:

  1. 有没有人能给我解释一下工作流程: 理想情况下应该怎么做。现在,我将上面的代码片段复制/粘贴到它们的指定位置,并继续在静态目录中创建新文件,这样就可以工作了。但是,在我的 settings.STATIC_ROOT中,我指向了一个不同的目录。

  2. 如果有人能够解释每个设置的工作流程: 如何收集和管理文件,以及应该遵循什么样的良好实践,那就太好了。

谢谢。

134657 次浏览

STATICFILES_DIRS: 您可以在这里保存项目的静态文件,例如您的模板使用的文件。

留下这个空的,当你做 manage.py collectstatic,它会搜索所有的静态文件在您的系统,并移动到这里。您的静态文件服务器应该映射到该文件夹所在的位置。在运行 Collectstatic 之后检查它,您将发现 django 构建的目录结构。

————编辑——————

正如@Dark Cygnus 所指出的,STATIC _ ROOT 应该指向文件系统上的一个目录,该文件夹应该是空的,因为它将由 Django 填充。

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

或者

STATIC_ROOT = '/opt/web/project/static_files'

————结束编辑——————

“/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

提供 STATIC_ROOT目录中静态文件的 URL(由 Apache 或 nginx. . etc 提供)。 例如: /static/http://static.example.com/

如果设置 STATIC_URL = 'http://static.example.com/',那么必须通过 apache 或 nginx 在 url '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-template 中,您可以通过以下方式引用它:

{% load static %}
<script src="{% static "jquery.js" %}"></script>

这将使:

<script src="http://static.example.com/jquery.js"></script>

以上所有的答案都很有帮助,但没有一个能解决我的问题。在我的生产文件中,我的 STATIC _ URL 是 https://<URL>/static,我在 dev setings.py 文件中使用了相同的 STATIC _ URL。

这会导致 django/conf/urls/static.py 无声失败。

测试 elif not settings.DEBUG or '://' in prefix: 获取 URL 中的“//”并且不添加静态 URL 模式,从而导致找不到静态文件。

如果 Django 吐出一个错误消息说您不能在 DEBUG = True中使用 http(s)://,那将是非常周到的

我必须将 STATIC _ URL 更改为’/STATIC/’

Django 3.1 + 之后,目录路径的配置略有变化,但是概念当然是相同的。

静态文件 _ DIRS

STATICFILES_DIRS = [
BASE_DIR / 'static',
BASE_DIR / 'app_1/static',
BASE_DIR / 'app_2/static',
]

顾名思义,它是一个目录列表。它用于为静态文件指定多个目录。对于应用程序的可重用性来说,这是最有用的。每个应用程序都有其独立的目录,而不是所有静态文件都有一个目录。就像每个应用程序的模板一样。

配置应用程序的静态文件目录:

=> my_app
=> static
=> my_app
=> css
=> js

在开发模式下,Django 使用命令 python manage.py runserver使用 STATICFILES_FINDERS设置搜索静态文件。默认情况下,它尝试在 STATICFILES _ DIRS 设置中列出的文件夹中查找请求的静态文件。在失败的情况下,Django 尝试使用 django.contrib.staticfiles.finders.AppDirectoriesFinder查找该文件,django.contrib.staticfiles.finders.AppDirectoriesFinder查找项目中每个已安装应用程序的静态文件夹。

静态根(STATIC _ ROOT)

STATIC_ROOT = BASE_DIR / 'static'

它是到 python manage.py collectstatic收集静态文件以进行部署的目录的绝对路径。例如:

/var/www/example.com/static/"

对于开发来说,不需要配置 STATIC_ROOT,但是对于生产来说非常重要。这是 Nginx 的 Apache 服务器访问网站静态文件的路径。

STATIC _ URL

当引用位于 STATIC _ ROOT 中的静态文件时使用的 URL。例如: “ STATIC/”或“ http://STATIC.Example.com/" ;

STATIC_URL = '/static/'

现在,假设我决定配置 STATIC_URL='/asset/',那么我需要更改 STATIC_ROOT=BASE_DIR / 'asset',并且我的目录名也应该是 asset

参考文献:

Https://docs.djangoproject.com/en/4.0/ref/contrib/staticfiles/

2022年5月更新:

首先,我解释关于 “ STATIC _ ROOT”然后 “ STATIC _ URL”

< STATIC _ ROOT >

“ STATIC _ ROOT” 设置 存储 django 项目中用于应用程序和管理员的静态文件的文件夹的绝对路径,下面的命令创建 并从 django 项目中的应用程序和管理员收集静态文件到该文件夹中(* 设置“ STATIC _ ROOT”永远不会影响静态文件 URL) :

python manage.py collectstatic

“ STATIC _ ROOT”只能在 制作模式中工作,即 “ DEBUG = False”,如下所示:

# "core/settings.py"


DEBUG = False // Production Mode

现在,我们有一个 django 项目,它的 “ core”文件夹中的静态文件“ core.js”,其中 < strong > “ setings.py”是,“ myapp”文件夹 中的“ myapp.css”是 “应用程序”,如下所示:

enter image description here

“ venv”文件夹中的“ admin”文件夹中的“ css”、“ font”、“ img”和“ js”文件夹,如下所示。* 我使用 这个 django 项目的虚拟环境名为“ venv”,所以 “ admin”的静态文件在里面,“管理”文件夹的相对路径“ venv/lib/python3.8/site-package/django/Contrib/admin/static/admin”:

enter image description here

然后,我们把 “ os.path.join (BASE _ DIR,‘ static’)”,也就是 在我的例子中,Windows 中的“ C: Users kai django-project static”设置为 “ STATIC _ ROOT”。此外,我们将 “假”设置为 “调试”,因为正如我之前所说,“ 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

然后,“静态”文件夹被创建,“ css”、“ font”、“ img”和“ js”文件夹在“ admin”文件夹中“ myapp”文件夹中的“ myapp.css”被收集到 “静态”文件夹中,如下所示,但是我们可以看到,“ core”文件夹中的“ core.js”没有被收集到 “静态”文件夹中,如下所示,因为正如我之前所说,命令“ python management. py Collectstatic”收集来自 django 项目中的应用程序和管理员的静态文件,但是 “ core”文件夹中的“ setings.py”不是一个应用程序和管理员。这就是为什么 “ core”文件夹中的“ core.js”没有被收集到 “静态”文件夹中:

enter image description here

但是,有一种方法可以将 “ core”文件夹中的“ core.js”收集到 “静态”文件夹中。要做到这一点,我们需要使用 “ STATICFiles _ DIRS”,然后设置 Join (BASE _ DIR,‘ core/static’)”在我的例子中,Windows 中的“ C: Users kai django-project core static”“ STATICFiles _ DIRS”,如下所示:

# "core/settings.py"


DEBUG = False


STATICFILES_DIRS = [ // Here
os.path.join(BASE_DIR, 'core/static')
]


STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/'

现在,我们再次运行以下命令:

python manage.py collectstatic

然后,输入 “是的”,然后按 “回车”覆盖 现有的“静态”文件夹:

您已请求在目标位置收集静态文件 按照您的设置指定:

C: 用户 kai django-project static

这将覆盖现有的文件! 确实要这样做吗?

键入“ yes”继续,或者键入“ no”取消: yes

现在,“ core”文件夹中的“ core.js”被收集到 “静态”文件夹中,如下所示:

enter image description here

< STATIC _ URL >

接下来,我将解释 “ STATIC _ URL”

“ STATIC _ URL”静态文件 URL 的主机部分和文件部分之间设置 静态文件 URL 的前端目录部分,如下所示(* 设置“ STATIC _ URL”永远不会影响存储 django 项目中用于应用程序和管理员的静态文件的文件夹的绝对路径) :

       |     Host      |   Directory    |  File  |
|               |Front |  Back   |        |
<-------------> <----> <-------> <------>
https://www.example.com/static/admin/css/base.css

例如,我们将 ’/静态/’设置为 “ STATIC _ URL”,如下所示(* “ STATIC _ URL”同时适用于 发展模式(即 “ DEBUG = True”)和 制作模式(即 “ DEBUG = False”)) :

# "core/settings.py"


DEBUG = False


STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'core/static')
]


STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/static/' # Here

然后,打开 姜戈管理员:

enter image description here

然后,按 “ F12”打开 “开发工具”检查 “来源”中当前打开的 Django 管理页面所使用的资源,就有了 为“管理”的静态文件,我们刚刚收集到“静态”文件夹:

enter image description here

然后,悬停在 “ css”中的 “ base.css”来检查 网址:

enter image description here

正如我们所看到的,我们可以设置 前面的目录部分“静态”:

                       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 _ URL”’/静态/’改为 “/hello/world/”,如下所示:

# "core/settings.py"


DEBUG = False


STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'core/static')
]


STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATIC_URL = '/hello/world/' # Here

然后,刷新 Django 管理页面:

enter image description here

然后,前面的目录部分“静态”改为 “你好/世界”,如下所示:

                         Here
<----------->
http://localhost:8000/hello/world/admin/css/base.css