我对static root
感到困惑,并希望澄清事情。
要在Django中提供静态文件,以下内容应位于settings.py
和urls.py
中:
import os
PROJECT_DIR=os.path.dirname(__file__)
STATIC_ROOT= os.path.join(PROJECT_DIR,'static_media/')
STATIC_URL = '/static/'
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}
))
python manage.py collectstatic
问题:
有人可以向我解释一下工作流程:理想情况下应该如何完成。到目前为止,我将上面的代码片段复制/粘贴到他们指定的位置,并继续在静态目录中创建新文件,它可以工作。但是,在我的settings.STATIC_ROOT
中,我指向了另一个目录。
如果有人可以解释每个设置的工作流程,那将会很棒:如何收集和管理文件,以及要遵循的良好做法。
感谢。
答案 0 :(得分:67)
./manage.py collectstatic
将收集静态文件以进行部署的目录的绝对路径。 示例:STATIC_ROOT="/var/www/example.com/static/"
现在命令./manage.py collectstatic
会将所有静态文件(即应用程序中的静态文件夹,所有路径中的静态文件)复制到目录/var/www/example.com/static/
。现在你只需要在apache或nginx..etc上提供这个目录。
URL
目录中的静态文件所服务的STATIC_ROOT
(由Apache或nginx..etc提供)。 示例:/static/
或http://static.example.com/
如果设置STATIC_URL = 'http://static.example.com/'
,则必须通过apache STATIC_ROOT
的apache或nginx提供"/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>
答案 1 :(得分:26)
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 :(得分:0)
以上所有答案都很有帮助,但没有一个解决了我的问题。在生产文件中,我的STATIC_URL为https://<URL>/static
,并且在我的dev settings.py文件中使用了相同的STATIC_URL。
这将导致django / conf / urls / static.py中出现静默故障。
测试elif not settings.DEBUG or '://' in prefix:
在网址中选择“ //”,并且不添加静态网址格式,从而导致找不到静态文件。
如果Django吐出一条错误消息,说明您不能将http(s)://
与DEBUG = True
一起使用,那会很周到。
我必须将STATIC_URL更改为“ / static /”