6

Django 建议我,如果我只使用一台服务器(Apache)来提供动态和静态文件,那么我应该使用django.contrib.staticfiles.

所以在我的settings.py我已经加载django.contrib.staticfiles到我的INSTALLED_APPSdjango.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_DIRSinside settings.py,但 Apache 仍然不会提供任何静态文件(在重新启动服务器之后)。我在哪里犯了逻辑错误?

4

2 回答 2

8

感谢 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并完成!

于 2012-04-01T08:39:21.760 回答
3

您链接到的文档根本没有说明使用 staticfiles 应用程序提供文件。这不是它的用途:它是为了将静态文件收集到一个地方,以便让 Apache 轻松地为它们提供服务。(它确实处理在开发中提供文件,但这不是我们在这里讨论的内容。)

您仍然需要设置 Apache 以通过 static/ 前缀从相关位置提供文件。

于 2012-03-31T22:46:03.660 回答