Обслуживание статических носителей при разработке 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.