Джанго медиа URL-адрес и корневой СМИ
Я пытаюсь загрузить изображение через администратора 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 ответов:
попробуйте положить это в ваш 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
пожалуйста, внимательно прочитайте официальный документ Django, и вы найдете наиболее подходящий ответ.
лучший и простой способ решить эту проблему, как показано ниже.
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)
для 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
нужно ли настраивать определенные шаблоны URLconf для загруженных носителей?
да. Для разработки это так же просто, как добавить это в свой URLconf:
if settings.DEBUG: urlpatterns += patterns('django.views.static', (r'media/(?P<path>.*)', 'serve', {'document_root': settings.MEDIA_ROOT}), )тем не менее, для производства вы хотите обслуживать носители с помощью Apache, lighttpd, nginx или вашего предпочтительного веб-сервера.
вот что я сделал в Django 2.0. Установите первый MEDIA_ROOT MEDIA_URL в
setting.pyMEDIA_ROOT = os.path.join(BASE_DIR, 'data/') # 'data' is my media folder MEDIA_URL = '/media/'затем включить
mediacontext_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>
(по крайней мере) для Django 1.8:
Если вы используете
if settings.DEBUG: urlpatterns.append(url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}))как описано выше, убедитесь, что в 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')),
еще одна проблема, с которой вы, вероятно, столкнетесь после настройки всех ваших шаблонов URLconf, заключается в том, что переменная
{{ MEDIA_URL }}не будет работать в ваших шаблонах. Чтобы исправить это, в вашем settings.py, Убедитесь, что вы добавляетеДжанго.ядро.context_processors.СМИ
в своем
TEMPLATE_CONTEXT_PROCESSORS.
вот изменения, которые я должен был сделать, чтобы доставить 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', ], }, }, ]
добавление к ответу Micah Carrick для django 1.8:
if settings.DEBUG: urlpatterns.append(url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}))
Это если для Django 1.10:
if settings.DEBUG: urlpatterns += staticfiles_urlpatterns() urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
ваши настройки в порядке. Некоторые веб-серверы требуют, чтобы указать медиа и статические файлы папок специально. Например, в pythonanywhere.com вы должны перейти в раздел " Web " и добавить url-адрес для папок мультимедиа и статической папки. Например:
URL Directory /static/ /home/Saidmamad/discoverthepamirs/static /accounts/static/ /home/Saidmamad/discoverthepamirs/accounts/static /media/ /home/Saidmamad/discoverthepamirs/discoverthepamirs/mediaЯ знаю, что уже поздно, но просто чтобы помочь тем, кто посещает эту ссылку из-за той же проблемы;)
Это то, что я сделал, чтобы достичь рендеринга изображений в режиме 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 ]
Comments