Django MEDIA_URL и MEDIA_ROOT - PullRequest
       28

Django MEDIA_URL и MEDIA_ROOT

202 голосов
/ 01 апреля 2011

Я пытаюсь загрузить изображение через администратора Django, а затем просмотреть его на странице во внешнем интерфейсе или просто по URL-адресу.

Обратите внимание, что это все на моем локальном компьютере.

Мои настройки следующие:

MEDIA_ROOT = '/home/dan/mysite/media/'

MEDIA_URL = '/media/'

Я установил для параметра upload_to значение 'images', и файл был правильно загружен в каталог:

'/home/dan/mysite/media/images/myimage.png'

Однако, когда я пытаюсь получить доступ к изображению по следующему URL:

http://127.0.0.1:8000/media/images/myimage.png

Я получаю сообщение об ошибке 404.

Нужно ли мне настраивать определенные шаблоны URLconf для загружаемых носителей?

Любой совет приветствуется.

Спасибо.

Ответы [ 12 ]

256 голосов
/ 01 апреля 2011

ОБНОВЛЕНИЕ для Django> = 1,7

В соответствии с документацией Django 2.1: Обслуживание файлов, загруженных пользователем во время разработки

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
    # ... the rest of your URLconf goes here ...
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Выбольше не нужно if settings.DEBUG, так как Django будет обрабатывать, гарантируя, что это используется только в режиме отладки.


ОРИГИНАЛЬНЫЙ ответ для Django <= 1.6 </strong>

Попробуйте поставить этов ваш urls.py

from django.conf import settings

# ... your normal urlpatterns here

if settings.DEBUG:
    # static files (images, css, javascript, etc.)
    urlpatterns += patterns('',
        (r'^media/(?P<path>.*)$', 'django.views.static.serve', {
        'document_root': settings.MEDIA_ROOT}))

При этом вы можете подавать статический носитель из Django, когда DEBUG = True (при запуске на локальном компьютере), но вы можете разрешить настройку веб-сервераподавать статические носители, когда вы идете в производство и DEBUG = False

100 голосов
/ 30 апреля 2013

Пожалуйста, внимательно прочитайте официальный Django DOC, и вы найдете наиболее подходящий ответ.

Лучший и простой способ решить эту проблему, как показано ниже.

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = patterns('',
    # ... the rest of your URLconf goes here ...
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
68 голосов
/ 23 декабря 2015

Для Django 1.9 вам необходимо добавить следующий код согласно документации:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Для получения дополнительной информации вы можете обратиться сюда: https://docs.djangoproject.com/en/1.9/howto/static-files/#serving-files-uploaded-by-a-user-during-development

23 голосов
/ 01 апреля 2011

Нужно ли настраивать определенные шаблоны URLconf для загружаемого мультимедиа?

Да. Для разработки это так же просто, как добавить это в ваш URLconf:

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

Тем не менее, для производства вам понадобится предоставить мультимедиа с использованием Apache, lighttpd, nginx или предпочитаемого вами веб-сервера.

16 голосов
/ 14 февраля 2018

Вот что я сделал в Django 2.0. Установите сначала MEDIA_ROOT MEDIA_URL в setting.py

MEDIA_ROOT = os.path.join(BASE_DIR, 'data/') # 'data' is my media folder
MEDIA_URL = '/media/'

Затем включите media context_processors в TEMPLATE_CONTEXT_PROCESSORS, добавив

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [],
    'APP_DIRS': True,
    'OPTIONS': {
        'context_processors': [
            #here add your context Processors
            'django.template.context_processors.media',
        ],
    },
},
]

Ваш media context processor включен, теперь каждый RequestContext будет содержать переменную MEDIA_URL.

Теперь вы можете получить доступ к этому в вашем template_name.html

<p><img src="{{ MEDIA_URL }}/image_001.jpeg"/></p>
6 голосов
/ 23 февраля 2016

(минимум) для Django 1.8:

Если вы используете

if settings.DEBUG:
  urlpatterns.append(url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}))

как описано выше, убедитесь, что в URL urlpatterns = [] нет шаблона URL "catch all", направляющего в представление по умолчанию. Поскольку .append поместит добавленную схему в конец списка, она, конечно, будет проверена только в том случае, если ни один предыдущий шаблон URL не совпадает. Вы можете избежать этого, используя что-то вроде этого, где шаблон URL «catch all» добавляется в самом конце, независимо от оператора if:

if settings.DEBUG:
    urlpatterns.append(url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}))

urlpatterns.append(url(r'$', 'views.home', name='home')),
5 голосов
/ 21 апреля 2017

Вот изменения, которые я должен был сделать, чтобы доставить PDF-файлы для приложения django-публикаций , используя Django 1.10.6:

Использовал те же определения для каталогов носителей, что и выsettings.py:

MEDIA_ROOT = '/home/user/mysite/media/'

MEDIA_URL = '/media/'

В соответствии с @thisisashwanipandey, в основной части проекта urls.py:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

и модификацией ответа, предоставленного @ r-allela, вsettings.py:

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                # ... the rest of your context_processors goes here ...
                'django.template.context_processors.media',
            ],
         },
    },
]
4 голосов
/ 23 июля 2015

Другая проблема, с которой вы, вероятно, столкнетесь после настройки всех шаблонов URLconf, заключается в том, что переменная {{ MEDIA_URL }} не будет работать в ваших шаблонах. Чтобы это исправить, в settings.py обязательно добавьте

django.core.context_processors.media

в вашем TEMPLATE_CONTEXT_PROCESSORS.

2 голосов
/ 14 октября 2015

Добавление к Мике Каррику ответа для Джанго 1.8:

if settings.DEBUG:
  urlpatterns.append(url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}))
1 голос
/ 04 октября 2018

Это то, что я сделал, чтобы добиться рендеринга изображений в режиме DEBUG = False в Python 3.6 с Django 1.11

from django.views.static import serve
urlpatterns = [
url(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}),
# other paths
]
...