Django上静态STATIC_URL和STATIC_ROOT的区别


126

我很困惑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. 如果有人可以解释每种设置的工作流程,那就太好了:文件的收集和管理方式以及遵循的最佳做法是什么。

谢谢。


您能否阐明“解释工作流程”的含义?如果您在第3部分中进行开发,那么您的url模式也应作为条件。您可以通过添加if settings.DEBUG:django不太擅长提供静态媒体来做到这一点,这应该留给真正的Web服务器。
dm03514 2011年

您好@ user993563我什至无法在几个论坛中找到我想要的解决方案。但您的问题清楚地说明了这一点,谢谢……好人……
Mohideen bin Mohammed

好的解释,谢谢
Ajay Kumar

Answers:


88

STATIC_ROOT

./manage.py collectstatic将收集静态文件以进行部署的目录的绝对路径。 例:STATIC_ROOT="/var/www/example.com/static/"

现在的命令 ./manage.py collectstatic会将所有静态文件(即,应用程序中的静态文件夹中的所有路径中的静态文件)复制到该目录/var/www/example.com/static/。现在您只需要在apache或nginx..etc上提供此目录。

STATIC_URL

URL其中的静态文件STATIC_ROOT目录供应(由Apache或nginx..etc)。 示例:/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模板中,您可以通过以下方式引用它:

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

它将呈现:

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

1
您的示例与以下示例之间的区别是什么:href =“ {%static” jquery.js“%}”
用户

8
@macdonjo都{{ STATIC_URL }}jquery.js{% static "jquery.js" %}相同。即两者都会回来/static/jquery.js。建议使用较新的django版本{% static "jquery.js" %},但您需要加载templatetag,即{% load staticfiles %}。在旧版django中推荐{{STATIC_URL}}
suhailvs 2014年

我懂了。我试图找到一个导致大多数模板加载我的样式表(除了一页)的错误。我将其更改为static方法而不是STATIC_URL方法,该错误消失了。好建议基于版本的建议。
用户

36

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



2
STATICFILES_DIRS应该用作静态文件的其他目录。如果将所有css / js / images放入APP_NAME / static / APP_NAME文件夹中,则无需指定STATICFILES_DIRS
laike9m 2013年

感谢您提供答案,关于将STATIC_ROOT保留为空,实际上我必须在运行collectstatic命令之前settings.py通过(通过STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles'))指定它。
DarkCygnus 18-4-18的

嗯,我知道这很容易引起误解。我的意思是将其保留为空通常是一开始都是空的,里面没有文件。我将更新答案以消除混乱。
keni

2

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

这会导致django / conf / urls / static.py中的无提示失败。

考试 elif not settings.DEBUG or '://' in prefix: 会在URL中选择'//',并且不会添加静态URL模式,从而不会找到任何静态文件。

如果Django吐出一条错误消息,说明您不能使用 http(s):// with,。DEBUG = True

我必须将STATIC_URL更改为“ / static /”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.