Django MEDIA URL и медиа-корень
Я пытаюсь загрузить изображение через администратора Django, а затем просмотреть это изображение на странице на интерфейсе или просто через URL.
обратите внимание, что все это на моей локальной машине.
Мои настройки следующие:
MEDIA_ROOT = '/home/dan/mysite/media/'
MEDIA_URL = '/media/'
Я установил параметр upload_to в "изображения" , и файл был правильно загружен в каталог:
'/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.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>
(по крайней мере) для Django 1.8:
Если вы используете
if settings.DEBUG:
urlpatterns.append(url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}))
как описано выше, убедитесь, что шаблон url-адреса" catch all", направленный на представление по умолчанию, не появляется раньше в urlpatterns = []. Как. 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-публикации app, используя 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
]