Обслуживание статических носителей при разработке Django: почему не MEDIA_ROOT?

Я прочитал это руководство о том, как обслуживать статические медиа с Django во время разработки.

Я заметил, что MEDIA_URL а также MEDIA_ROOT не были использованы в этом. Зачем? Какая разница?

Я пытался сделать это с MEDIA_URL а также MEDIA_ROOTи получил странные результаты.

3 ответа

Решение

В производственной ситуации вы хотите, чтобы ваши медиаданные обслуживались с вашего интерфейсного веб-сервера (Apache, Nginx и т. П.), Чтобы избежать дополнительной нагрузки на процесс Django/Python. Для этого обычно используются MEDIA_URL и MEDIA_ROOT.

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

from django.conf import settings

urlpatterns += patterns('',
    (r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
)

Который выбирает MEDIA_ROOT из вашего файла настроек, что означает, что он работает для разработки и вживую.

Прямо из комментариев в settings.py...

MEDIA_ROOT

MEDIA_ROOT это абсолютный путь к каталогу, который содержит носитель, такой как /home/media/media.lawrence.com/,

MEDIA_URL

MEDIA_URL URL-адрес, который обрабатывает мультимедийные данные с MEDIA_ROOT, Обязательно используйте косую черту, если есть компонент пути (необязательно в других случаях). Примеры: " http://media.lawrence.com/", " http://example.com/media/".

Итак, чтобы перефразировать те... MEDIA_ROOT где файлы живут физически в вашей системе, и MEDIA_URL где эти файлы сопоставлены. В процессе разработки это может быть не всегда доступно, и в большинстве случаев ваша среда разработки и производственная среда не совпадают, и вам придется вернуться и измениться. Другое дело, что это НЕ ХОРОШАЯ ПРАКТИКА, когда Django был разработан, чтобы НЕ показывать вам статический контент.

Если вы собираетесь использовать это в разработке, я предлагаю вам использовать метод ограничения его до DEBUG = True. Говоря Django об обслуживании статического контента из временного местоположения во время разработки, когда DEBUG установлен в True это гораздо лучшая и безопасная практика. Вы НЕ собираетесь запускать свой сайт с DEBUG справа? Ну, по крайней мере, ты не должен.

Вот как я это реализовал:

settings.py:

STATIC_DOC_ROOT = os.path.join(os.getcwd(), 'site_media')

urls.py:

from django.conf import settings
## debug stuff to serve static media
if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^site_media/(?P<path>.*)$', 'django.views.static.serve', 
            {'document_root': settings.STATIC_DOC_ROOT}),
   )

Таким образом, любой проект, над которым я работаю, имеет site_media каталог внутри него со всеми необходимыми носителями. В dev он самодостаточен, и мне не нужно переворачивать биты в настройках, кроме DEBUG, что я буду делать в любом случае.

Django docs рекомендует следующий подход, который я изменил для моего случая использования:

urlpatterns = [
    # url patterns
]

from django.conf import settings

if settings.DEBUG:
    from django.conf.urls.static import static
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Примечание: вышеизложенное предполагает, что вы установили MEDIA_URL а такжеMEDIA_ROOTправильно

... а вот и ссылка на djangodocs.

Другие вопросы по тегам