Как Django Apps должен связывать статические медиа? - PullRequest
13 голосов
/ 14 января 2010

Фон:

Я начинаю использовать Django впервые, и это тоже мой первый опыт веб-разработки. Я просто застрял во всей проблеме "подачи статических носителей". Потратив некоторое время на просмотр всей документации и вопросов StackOverflow, я думаю, что понимаю, как это должно работать (т.е. MEDIA_ROOT, MEDIA_URL, обновление файла urls и т. Д.).

Мой вопрос :

Хорошо, вот часть, в которой я не уверен. Приложения Django должны быть «подключаемыми», то есть я могу перемещать приложения из одного проекта в другой. Итак, как эти приложения должны связывать статические носители?

Например, допустим, у меня есть приложение "foo", в котором есть шаблоны, загружающие некоторые файлы css / image. Где я должен поместить эти файлы, чтобы они автоматически обслуживались после включения приложения?

Единственное решение, которое я вижу, заключается в том, что установка приложения должна включать дополнительный этап копирования его статического носителя в какое-то место на вашем собственном сервере, который обслуживает этот носитель.

Это приемлемый способ сделать это? Он включает в себя дополнительный шаг, но, возможно, это стандартно при работе с web-dev (я новичок, поэтому я не знаю).

Кроме того, если это так, есть ли стандартный способ собрать все мои статические носители, чтобы было проще узнать, что мне нужно обслуживать? (То есть, это стандартная папка с именем "media" или что-то в приложении?).

Спасибо

Ответы [ 3 ]

9 голосов
/ 14 января 2010

Соглашение заключается в размещении статического носителя в приложении media / appname / или static / appname / внутри приложения (аналогично шаблонам).

Для использования приложений в вашем проекте, которые поставляются с мультимедиа, я настоятельно рекомендую использовать Джанго-staticfiles .Он будет автоматически предоставлять мультимедиа (включая мультимедиа в приложениях) при разработке через представление, заменяющее django.views.static.serve, и поставляется с командой управления build_static, которая будет копировать мультимедиа из всех приложений в один каталог для обслуживания в производстве.

Обновление : django-staticfiles стал частью Django 1.3 .Теперь ожидается, что носители приложения будут жить в подкаталоге «static /» приложения, а не в «media /».И команда управления теперь "коллекторная".

2 голосов
/ 14 января 2010

Я обычно помещаю мультимедийные приложения в ./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 для сервера разработки (используйте только для отладки):

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

надеюсь, это поможет

2 голосов
/ 14 января 2010

Единственное известное мне приложение, которое занимается этим без какого-либо вмешательства, - это довольно замечательная django-debug-toolbar , хотя можно утверждать, что это не отличный пример, так как это приложение, специально разработанное только для режима отладки.

То, как он справляется с этим, заключается в том, что он обслуживает свои медиа через сам Django - см. Источник urls.py :

url(r'^%s/m/(.*)$' % _PREFIX, 'debug_toolbar.views.debug_media'),

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

[Обслуживание статических файлов через Django] неэффективно и небезопасный. Не используйте это в настройка производства. Используйте это только для развитие.

Очевидно, что django-debug-toolbar используется только для разработки, поэтому я думаю, что ее метод развертывания имеет смысл, но это очень исключение.

В общем, я знаю, что лучший способ сделать это - создать символические ссылки, где бы ваши медиафайлы не хранились на носителях внутри кода вашего приложения. Например, создайте папку с именем media в своем приложении, а затем попросите пользователей, устанавливающих ваше приложение, добавить символическую ссылку из своего каталога мультимедиа или скопировать все это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...