Django中的STATIC_ROOT和STATIC_URL

170 投票
5 回答
151801 浏览
提问于 2025-04-17 09:19

我对 static root 有点困惑,想弄清楚一些事情。

在 Django 中,要提供静态文件,需要在 settings.pyurls.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

问题:

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

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

谢谢。

5 个回答

11

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.jscore 文件夹里,settings.py 也在这个文件夹里,还有 myapp.cssmyapp 文件夹里,这个文件夹是 一个应用,如下所示:

这里输入图片描述

还有 admin 文件夹里的 cssfontsimgjs 文件夹,这些都在 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 文件夹里的 cssfontsimgjs 文件夹,以及 myapp.css 都被收集到 static 文件夹里,如下所示。但如我们所见,core.jscore 文件夹里并没有被收集到 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.jscore 文件夹里被收集到 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.comhttps 的情况下:

                         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
43

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/' 就可以了,这只是静态文件的前缀。

113

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>

撰写回答