Django建议我,如果我只使用一台服务器(Apache)来同时提供动态和静态文件,那么I should serve static files using django.contrib.staticfiles
。
因此,在settings.py
我已将django.contrib.staticfiles
加载到INSTALLED_APPS
和django.core.context_processors.static
加载到TEMPLATE_CONTEXT_PROCESSORS
。
我在管理模板中注意到它链接到这样的静态文件(来自index.html
):
{% load i18n admin_static %}
{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/dashboard.css" %}" />{% endblock %}
但是查看模板标记admin_static
,它只是static
的包装器:
from django.conf import settings
from django.template import Library
register = Library()
if 'django.contrib.staticfiles' in settings.INSTALLED_APPS:
from django.contrib.staticfiles.templatetags.staticfiles import static
else:
from django.templatetags.static import static
static = register.simple_tag(static)
所以我得出结论,因为每个管理静态文件都是服务器,带有admin/...
前缀,那么完整路径(对于我的情况)应该是
/usr/lib64/python2.7/site-packages/django/contrib/admin/static
所以我将该路径设置为STATICFILES_DIRS
内的settings.py
,但Apache仍然不会提供任何静态文件(在重新启动服务器之后)。我的逻辑在哪里犯了错误?
答案 0 :(得分:9)
感谢Daniel Roseman的解释并让我有机会自己学习(现在我不会忘记!): - )。
最初我真的很困惑,我不知道你必须首先收集静态文件,然后告诉Apache 发送它。我想只需使用STATICFILES_DIRS
并在static
中添加settings.py
应用就足够了。
所以我就是这样做的(如果我能做得更好,请告诉我):
在settings.py
STATIC_ROOT = '/var/www/localhost/htdocs/mysite/static/'
STATIC_URL = '/static/' # default
似乎Django已经知道在哪里收集管理文件,你不需要在STATICFILES_DIRS
中指定任何内容,除非你需要提供你自己的自定义文件(我没有,因此我没有事先在Django中体验静态文件。)
然后在/var/www/localhost/htdocs/mysite/
类型python manage.py collectstatic -l
。 -l
意味着创建一个指向所有找到的静态文件的符号链接,而不是将其复制(节省一些空间)。
接下来编辑Apache配置文件(通常为httpd.conf
)并添加STATIC_URL
信息。我的Django配置文件如下所示:
Alias /static/ /var/www/localhost/htdocs/mysite/static/
#In the form of...
#Alias STATIC_URL STATIC_ROOT
<Directory /var/www/localhost/htdocs/mysite/static>
Order deny,allow
Allow from all
</Directory>
WSGIScriptAlias / /var/www/localhost/htdocs/mysite/mysite/wsgi.py
WSGIPythonPath /var/www/localhost/htdocs/mysite
<Directory /var/www/localhost/htdocs/mysite/mysite>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
然后重启Apache并完成!
答案 1 :(得分:3)
您链接到的文档没有说明使用staticfiles应用程序提供提供文件的任何内容。这不是它的用途:它用于将静态文件收集到一个地方,以便Apache可以轻松地为它们提供服务。 (它确实处理开发中的文件服务,但这不是我们在这里讨论的内容。)
您仍然需要设置Apache以通过static / prefix从相关位置提供文件。