Как обслуживать статические файлы администратора с помощью django.contrib.staticfiles в Django 1.4 (используя один сервер Apache)? - PullRequest
6 голосов
/ 01 апреля 2012

Django рекомендует мне, если я собираюсь использовать только один сервер (Apache) для обслуживания как динамических, так и статических файлов, тогда Я должен обслуживать статические файлы, используя 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)

Так что япришел к выводу, что поскольку каждый статический файл администратора имеет serverd с префиксом admin/..., то полный путь (для моего случая) должен быть

/usr/lib64/python2.7/site-packages/django/contrib/admin/static

, поэтому я установил этот путь к своему STATICFILES_DIRS внутри settings.py, но Apache по-прежнему не будет обслуживать статические файлы (после перезапуска сервера).Где я допустил ошибку в моей логике?

Ответы [ 2 ]

9 голосов
/ 01 апреля 2012

Спасибо Дэниелу Роузману за объяснение и предоставил мне возможность изучить его самостоятельно (и теперь я не забуду!): -).

Изначально я был в замешательстве и не знал, что вам сначала нужно собрать статических файлов, а затем сказать 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 и готово!

3 голосов
/ 01 апреля 2012

В документации, на которую вы ссылаетесь, ничего не говорится о обслуживании файлов с помощью приложения staticfiles.Это не то, для чего это нужно: это для сбора статических файлов в одном месте, чтобы Apache легко их обслуживал.(Это касается обслуживания файлов в процессе разработки, но это не то, о чем мы здесь говорим.)

Вам все еще нужно настроить Apache для обслуживания файлов из соответствующего местоположения через статический / префикс.

...