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

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

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

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

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

4b9b3361

Ответ 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.