Django 上静态 STATIC_URL 和 STATIC_ROOT 之间的区别

问题描述 投票:0回答:3

我对

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

问题:

  1. 有人可以向我解释一下工作流程吗:理想情况下应该如何完成事情。截至目前,我将上述代码片段复制/粘贴到指定位置,并继续在静态目录中创建新文件,它就可以工作了。然而,在我的

    settings.STATIC_ROOT
    中,我指向了另一个目录。

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

谢谢。

python python-3.x django django-urls django-staticfiles
3个回答
109
投票

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在url
STATIC_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>

42
投票

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/'通常没问题,它只是静态文件的前缀。


7
投票

2022 年 5 月更新:

首先,我解释一下“STATIC_ROOT”,然后解释“STATIC_URL”

“STATIC_ROOT”设置存储用于 django 项目中的应用程序和管理的静态文件的文件夹的绝对路径,下面的命令创建文件夹并从 django 中的应用程序和管理收集静态文件项目到文件夹(*设置“STATIC_ROOT”永远不会影响静态文件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

© www.soinside.com 2019 - 2024. All rights reserved.