Django MEDIA_URL и MEDIA_ROOT

Я пытаюсь загрузить изображение через администратор 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.

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

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

Спасибо.

Ответ 1

Попробуйте поместить это в свой 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

Ответ 2

Пожалуйста, внимательно прочитайте официальный 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)

Связанный URL-адрес: https://docs.djangoproject.com/en/1.5/howto/static-files/#serving-files-uploaded-by-a-user

Ответ 3

Для 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

Ответ 4

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

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

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

Однако для производства вам нужно будет использовать носитель, используя Apache, lighttpd, nginx или ваш предпочтительный веб-сервер.

Ответ 5

(по крайней мере) для Django 1.8:

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

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

как описано выше, убедитесь, что в urlpatterns = [] не указывается шаблон "уловить все", направляя представление по умолчанию. Поскольку .append добавит добавленную схему в конец списка, она, конечно, будет протестирована только в том случае, если предыдущий шаблон url не совпадает. Вы можете избежать этого, используя что-то вроде этого, когда шаблон "уловить все" url добавлен в самом конце, независимо от оператора 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')),

Ответ 6

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

django.core.context_processors.media

в TEMPLATE_CONTEXT_PROCESSORS.

Ответ 7

Вот изменения, которые мне пришлось внести, чтобы доставить PDF файлы для django-publications, используя 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',
            ],
         },
    },
]

Ответ 8

Добавление к Micah Carrick ответ на django 1.8:

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

Ответ 9

Это, если для Django 1.10:

 if settings.DEBUG:
    urlpatterns += staticfiles_urlpatterns()
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)