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