Джанго медиа 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 для загруженных носителей?



любой совет оценил.



спасибо.

614   12  

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/'

затем включить 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

    Ничего не найдено.