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.

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

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

Благодарю.

19 ответов

Решение

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

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

Вот что я сделал в 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>

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

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

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

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

Если вы используете python 3.0+, настройте свой проект, как показано ниже.

Параметр

      STATIC_DIR = BASE_DIR / 'static'
MEDIA_DIR = BASE_DIR / 'media'
MEDIA_ROOT = MEDIA_DIR
MEDIA_URL = '/media/'

Основные URL-адреса

      from django.conf import settings
from django.conf.urls.static import static

urlspatterns=[
........
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Вот изменения, которые я должен был сделать, чтобы доставить 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',
            ],
         },
    },
]

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

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

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

как описано выше, убедитесь, что в urlpatterns = [] нет шаблона URL-адреса "перехватить все", направленного на представление по умолчанию. Поскольку.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 обязательно добавьте

django.core.context_processors.media

в вашем TEMPLATE_CONTEXT_PROCESSORS,

Следуя шагам, упомянутым выше для =>3.0 для режима отладки

urlpatterns = [
...
]
+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

А также то, что меня зацепило, приведенный выше статический URL-адрес работал только в моем основном файле urls.py проекта. Сначала я пытался добавить что-то в свое приложение и задавался вопросом, почему я не вижу изображения.

Наконец, убедитесь, что вы установили следующее:

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

Это если для Джанго 1.10:

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

Это то, что я сделал, чтобы добиться рендеринга изображений в режиме 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
]

Добавляем к Мике Каррику ответ для Джанго 1.8:

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

В производственной среде Django не загружает корень носителя автоматически, поэтому мы можем решить эту проблему, добавив следующие коды сразу после шаблонов URL:

      urlpatterns = [
       ''''
         your urls
       ''''
    ] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
    if settings.DEBUG:
        urlpatterns += static(settings.MEDIA_URL,
                              document_root=settings.MEDIA_ROOT)

Если вы используете более одного приложения и включаете URL-адреса приложений в URL-адрес основного приложения, просто добавьте этот код (конфигурацию) в URL-адрес основного проекта.

С твоими настройками все в порядке. Некоторые веб-серверы требуют указывать файлы мультимедиа и статических папок специально. Например, на pythonanywhere.com вы должны перейти в раздел "Интернет" и добавить URL-адрес папок мультимедиа и статической папки. Например:

  URL                     Directory                
/static/            /home/Saidmamad/discoverthepamirs/static     
/accounts/static/   /home/Saidmamad/discoverthepamirs/accounts/static    
/media/            /home/Saidmamad/discoverthepamirs/discoverthepamirs/media    

Я знаю, что уже поздно, но просто, чтобы помочь тем, кто посещает эту ссылку из-за той же проблемы;)

Добавьте этот код ниже в «settings.py» , чтобы получить доступ (открыть или отобразить) загруженные файлы:

      # "settings.py"

from django.conf import settings
from django.conf.urls.static import static

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

MEDIA_ROOT - это корневой путь вашего проекта. MEDIA_URL должен быть правильным. Проверьте следующий параметр settings.py вашего проекта

      MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

urls.py проекта

       urlpatterns = [
                  url(r'^admin/', admin.site.urls),
                  # url('', include('app1.urls')),
                  url('home/', myapp_views.index)
              ] + static(settings.MEDIA_URL, 
             document_root=settings.MEDIA_ROOT)

Я столкнулся с той же ошибкой за последние 5 дней, следуйте документации django, много руководств, но у меня ничего не работает, но, наконец, я нашел решение

Я показываю index.html на домашней странице, это означает, что я не указал конечную точку в URL-адресе моего приложения и файла URL-адреса проекта.

приложение / urls.py

      urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url('', 'views.index', name='index page'),
]

проект / urls.py

      urlpatterns = [
                  url(r'^admin/', admin.site.urls),
                  url('', myapp_views.index)
              ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

Остальной код остался прежним, и я изменил следующее в обоих файлах

приложение / urls.py

      url('home/', 'views.index', name='index page'),

проект / urls.py

      url('home/', myapp_views.index)

Это работает для меня. Примите ответ, если он вам тоже подходит .. HAPP CODING

Для Django 3.0+, находящегося в разработке, в вашем основном urls.py укажите следующее:

      urlpatterns = [
   # rest of your url paths here..
]

from django.conf import settings
from django.conf.urls.static import static

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

Добавьте этот код вsettings.py

      urlpatterns = [ 

....

....


]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Другие вопросы по тегам