Как Django Apps связывает статические носители?
Фон:
Я начинаю использовать Django в первый раз, что также является моим первым набегом на веб-разработку. Я просто застрял во всем "обслуживании статических медиа". Проведя некоторое время, просматривая все документы и вопросы StackOverflow, я думаю, что понимаю, как он должен работать (т.е. MEDIA_ROOT, MEDIA_URL, обновление файла urls и т.д.).
Мой вопрос:
Итак, вот часть, о которой я не уверен. Приложения Django должны быть "подключаемыми", т.е. Я могу перенести приложение из одного проекта в другой. Итак, как эти приложения должны связывать статические носители?
Например, скажем, у меня есть приложение "foo", в котором есть шаблоны, которые загружают некоторые файлы css/image. Где я должен помещать эти файлы, чтобы они автоматически включались после включения приложения?
Единственное решение, которое я вижу, заключается в том, что установка приложения должна включать дополнительный шаг копирования своего статического носителя в какое-то место на вашем собственном сервере, который обслуживает этот носитель.
Это приемлемый способ сделать это? Он включает в себя дополнительный шаг, но, возможно, этот стандарт при работе с веб-разработчиком (я новичок, поэтому я действительно не знаю).
Кроме того, если это так, существует ли стандартный способ собирать все мои статические носители, чтобы было легко узнать, что мне нужно для обслуживания? (I.e., стандартно ли иметь папку с именем "media" или что-то внутри приложения?).
Спасибо,
Ответы
Ответ 1
Конвенция ставит статические носители в медиа/appname/или static/appname/внутри приложения (аналогично шаблонам).
Для использования приложений в вашем проекте, которые поставляются со средствами массовой информации, я настоятельно рекомендую использовать django-staticfiles. Он автоматически будет обслуживать медиа (включая медиа в приложениях) в разработке через представление, которое заменяет django.views.static.serve, и оно поставляется с командой управления build_static, которая будет копировать носители из всех приложений в один каталог для работы на производстве.
Обновить: django-staticfiles станет частью Django 1.3. Теперь он ожидает, что приложения будут жить в подкаталоге "static/" приложения, а не "media/". И команда управления теперь "collectstatic".
Ответ 2
Единственное приложение, которое я знаю об этом, без какого-либо вмешательства - это довольно замечательный django-debug-toolbar, хотя он утверждает, что это isn отличный пример, поскольку это приложение специально предназначено только для режима отладки.
То, как он справляется с этим, заключается в том, что он обслуживает свои носители через сам Django - см. источник urls.py:
url(r'^%s/m/(.*)$' % _PREFIX, 'debug_toolbar.views.debug_media'),
В общем, это плохая идея (вы не хотите использовать статические файлы через Django), за этот комментарий из документации:
[Обслуживание статических файлов через Django] неэффективно и небезопасный. Не используйте это в постановка. Используйте это только для развитие.
Очевидно, что панель инструментов django-debug используется только для разработки, поэтому я считаю, что ее метод развертывания имеет смысл, но это очень исключение.
В общем, лучший способ, который я знаю, это создать символические ссылки везде, где ваш носитель хранится на носителе внутри вашего кода приложения. Например, создайте в своем приложении папку с именем media
, а затем попросите пользователей, устанавливающих ваше приложение, либо добавить символическую ссылку из своего медиа-каталога, либо скопировать все это.
Ответ 3
Я обычно помещаю файлы приложений в. /apps/appname/static (мои приложения находятся в подпапках приложений)
то у меня есть что-то подобное в vhost в apache:
AliasMatch ^/apps/([^/]+)/static/(.*) /home/django/projectname/apps/$1/static/$2
<DirectoryMatch "^/home/django/projectname/apps/([^/]+)/static/*">
Order deny,allow
Options -Indexes
deny from all
Options +FollowSymLinks
<FilesMatch "\.(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf|txt|htm|html|json)$">
allow from all
</FilesMatch>
</DirectoryMatch>
У меня также есть это в моем urls.py для dev-сервера (используйте только для отладки):
def statics_wrapper(request, **dict):
from django.views import static
return static.serve(request, dict['path'], document_root = os.path.join(settings.BASE_DIR, 'apps', dict['app'], 'static'), show_indexes=True)
urlpatterns += patterns('', (r'^apps/(?P<app>[^/]+)/static/(?P<path>.+)$', statics_wrapper))
это очень удобно, потому что URL-адрес статистики просто сопоставляется с файловой системой, например:
http://wwww.ecample.com/apps/calendar/static/js/calendar.js находится в [BASE_DIR]/apps/calendar/static/js/calendar.js
надеюсь, что это поможет