MyTetra Share
Делитесь знаниями!
Настройка директории static в Django 1.5
Время создания: 04.11.2013 22:15
Текстовые метки: django, python, static, статика, админка
Раздел: Компьютер - Программирование - Язык Python - Django
Запись: xintrea/mytetra_syncro/master/base/13835889027k7xwto4se/text.html на raw.github.com

Большой загадкой Django 1.5, с первых же попыток её настроить, оказалась директория статики. Интернет перстрит вопросами по этой проблеме, а в ответах скопились устаревшие данные, костыльные решения, неработающие примеры, загадки в стиле "догадайся сам" и прочий откровенный бред.


Здесь попытаюсь кратко изложить что мне удалось накопать в процессе первичной настройки Django 1.5, которая растянулась на две недели.

Хинт! Прочитав эту статью, вы наконец поймете, как сделать доступными статические css-файлы для оформления админки.


Настроечные переменные статики

В Django есть несколько переменных, которые настраивают директорию со статическими файлами. Очень важно понимать, что они означают (а означают они не то, что можно понять из их названия). Поэтому читаем дальше вдумчиво.


Переменные, настраивающие директорию статики, находятся в файле settings.py вашего Django-приложения. Всего таких переменных три:


1.


Переменная STATIC_ROOT - содержит строку с полным путем к директории, куда будут автоматически складываться все статические файлы. Говорят, что в приложении Django каталог static может находиться в каталоге приложения, а так же каталог static может находиться в каждом приложении. И вообще каталогов static может быть несколько. И они могут по-разному называться.


Так вот, в режиме отладки (когда в файле settings.py прописано DEBUG=True), Django не отдает просто так статические директории (как это исправить смотри ниже). А в режиме продакшена Django вообще не работает со статическими директориями, полагая что статику должен отдавать сервер. Так как же получать статические файлы из Web?


Переменная STATIC_ROOT указывает путь, куда будут сложены все файлы из всех статических директорий. В конце обязательно должен быть завершающий слеш. Пример:


STATIC_ROOT = '/var/www/libretag/data/collected_static/'


Чтобы сложить все static-каталоги (и их подкаталоги) в данную директорию, используется команда:


django-admin.py collectstatic


Данную команду надо выполнять в директории приложения. Одинаковые имена файлов обратываются так: будет использоватся первый найденный файл. Если вы запутались, команда django-admin.py findstatic может показать какой конкретно файл используется.


Для того, чтобы отдавать статику из данной директории в режиме отладки, надо прописать выдачу файлов в диспетчере путей urls.py:


urlpatterns = patterns('',


....


# Uncomment the next line to enable the admin:

url(r'^admin/', include(admin.site.urls)),


....


(r'^static/(.*)$', ‘django.views.static.serve’, {

‘document_root’: settings.STATIC_ROOT

}),

)


Данная настройка позволит отдавать статические файлы через Django. Это достаточно медленное решение, но для отладки подойдет.


Проверить - возможно, пропущены символы url в добавляемых строках.


Для того, чтобы отдавать статику из данной директории в режиме продакшена, надо просто настроить выдачу средствами веб-сервера. Например, для Apache-2 в его конфиге (или в конфиге виртуального хоста) надо прописать примерно следующее:


Alias /static/ /var/www/libretag/data/collected_static/


<Directory /var/www/libretag/data/collected_static>

Order deny,allow

Allow from all

</Directory>


Кстати, после такой настройки, статика будет отдаваться через Apache и в отладочном режиме.


Обе вышеприведенные настройки (для отладки и продекшена) позволяют отдавать статику из URL-ов вида http://libretag.ru/static/...


2.


Переменная STATIC_URL. Содержит строку, в которой указывается префикс для URL-а статики. URL указывается с завершающим слешем. Можно указывать как часть URL-а, например так:


STATIC_URL = '/static/'


так и полный URL:


STATIC_URL = 'http://libretag.ru/static/'


При обращении к такому урлу, будут выдаваться файлы из директории, настроенной в пункте 1.



3.


Переменная STATICFILES_DIRS. Сразу обращаем внимание на букву "S" в конце и понимаем, что данная переменная должна содержать не одну строку, а кортеж с перечислением директорий, в которых находятся статические файлы.


Пример:


STATICFILES_DIRS = (

'/var/www/libretag/app/app/static',

'/var/www/libretag/blog/blog/static',

'/usr/share/pyshared/django/contrib/admin/static'

)


Внимание! В перечисляемых директориях не должно быть директории STATIC_ROOT из п. 1.


Именно из этих директорий команда django-admin.py collectstatic собирает все файлы и складывает в директорию STATIC_ROOT.



И помните! Для применения изменений, произведенных в python-файлах, в Django надо выполнять отдельное действие "обновления", или производить специальные touch-настройки. Я пока что не разобрался, как обновлять изменения файлов в связке Apache2+WSGI, поэтому просто перезапускаю Апач:


service apache2 restart


Это некрасиво и неправильно, но другого решения пока не нашел.

Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования