Обслуживание статических носителей при разработке Django: почему бы не MEDIA_ROOT?
Я прочитал это руководство о работе со статическим носителем с Django во время разработки.
Я заметил, что MEDIA_URL
и MEDIA_ROOT
не использовались в этом. Зачем? Какая разница?
Я попытался сделать это с MEDIA_URL
и MEDIA_ROOT
и получил странные результаты.
Ответы
Ответ 1
В производственной ситуации вы хотите, чтобы ваши медиафайлы были поданы с вашего веб-сервера (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 из вашего файла настроек, что означает, что он работает для разработки и жизни.
Ответ 2
Прямо из комментариев в 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
, которые я бы делал в любом случае.
Ответ 3
Документы Django рекомендуют следующий подход, который я изменил для своего варианта использования:
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 linkslap.