장고 MEDIA_URL 및 MEDIA_ROOT


229

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 패턴을 설정해야합니까?

모든 조언을 부탁드립니다.

감사.

답변:


293

장고 업데이트 => 1.7

Django 2.1 문서 당 : 개발 중 사용자가 업로드 한 파일 제공

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)

if settings.DEBUG장고가 디버그 모드에서만 사용되도록 처리 하므로 더 이상 필요하지 않습니다 .


장고에 대한 원래 답변 <= 1.6

이것을 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}))

이 기능을 사용하면 DEBUG = True(로컬 컴퓨터에서 실행할 때) Django에서 정적 미디어를 제공 할 수 있지만 프로덕션 및DEBUG = False


14
추신. 그런 다음 템플릿에서이를 사용할 수 있습니다. <img src = "{{MEDIA_URL}} images / myimage.png"/>
— Micah Carrick

^전에 media//(?P<path>.*)$앱 URL 경로의 미디어 파일에 액세스 할 때 (예 :) 전에 부호 를 추가하는 것이 좋지 않다고 생각합니다 http://127.0.0.1:8000/myapp/media/img/logo.png.
— Jack Zhang

2 일 동안 이미지가 404를 반환하는 이유에 대해 어려움을 겪고 있습니다. 이것이 내가 놓친 유일한 것인데 Django doc에서 찾을 수 없습니다. 감사.
— tambalolo

1
Django 1.5 이상을 사용하는 경우 아래 답변을 참조하십시오. 더 나은 솔루션입니다.
— Thane Brimhall

앱 또는 프로젝트 urls.py에 있습니까?
— user7804781

105

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)

1
django 1.5에 추가 된 새로운 기능입니다.
— codeVerine

아파치로 제작할 때 이런 식으로 사용하는 것이 좋습니까?
— andilabs

1
@andi-프로덕션에서 이런 식으로 사용하는 것은 좋지 않습니다. 프로덕션 환경에서 아파치를 통해 구성해야합니다.
— Vikas Gulati


1
그러나이 코드는 if settings.DEV자동으로 비활성화되어 있기 때문에 확인 하지 않고 프로덕션 환경에 남겨 두는 것이 좋습니까?
— jozxyqk

70

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


2
이것은 django> 1.9, thnks에 대한 솔루션입니다.
— unixeO

13
실수로 내가 한 일을 앱이 아닌 프로젝트 의 urls.py에 넣으십시오 .
— Jarno

3
1.10에서도 저를 위해 일했습니다.
— Deleet

나를 위해 작동하지 않습니다. settings.py에 필요한 기본 설정이 있습니까?
— Fusion

25

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>

훌륭하게 설명했습니다-이것이 저에게 답이었습니다. 핵심은 미디어 컨텍스트 프로세서를 추가하는 것이 었습니다 .
— David Maness

23

업로드 된 미디어에 대해 특정 URLconf 패턴을 설정해야합니까?

예. 개발을 위해 이것을 URLconf에 추가하는 것만 큼 쉽습니다.

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

그러나 프로덕션 환경에서는 Apache, lighttpd, nginx 또는 선호하는 웹 서버를 사용하여 미디어를 제공해야합니다.


3
서버를 어떻게 구성합니까?
— M Hornbacher

"패턴"에 대한 해결되지 않은 참조가 있는데 어딘가에서 가져온 것입니까?
— user7804781

6

(장소) 장고 1.8의 경우 :

당신이 사용하는 경우

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

위에서 설명한 것처럼 기본보기로 향하는 "모두 포괄"URL 패턴이 urlpatterns = []에서 끝나지 않아야합니다. .append는 추가 된 스키마를 목록의 끝에 배치하므로 이전 URL 패턴과 일치하지 않는 경우에만 테스트됩니다. if 문과 상관없이 "catch all"url 패턴이 맨 끝에 추가되는 다음과 같은 것을 사용하면이를 피할 수 있습니다.

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

Django 1.10.6을 사용하여 django-publications 앱용 PDF를 제공하기 위해 변경해야 할 사항은 다음과 같습니다 .

다음에서 미디어 디렉토리에 대해 동일한 정의를 사용했습니다 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',
            ],
         },
    },
]

4

모든 URLconf 패턴을 설정 한 후 직면 할 수있는 또 다른 문제는 {{ MEDIA_URL }}템플릿에서 변수 가 작동하지 않는다는 것입니다. 이 문제를 해결하려면 settings.py 에서 추가하십시오.

django.core.context_processors.media

당신의 TEMPLATE_CONTEXT_PROCESSORS.


2

django 1.8에 대한 Micah Carrick 답변 추가 :

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

1
나를 위해 작동하지 않습니다 (1.10). TypeError: view must be a callable or a list/tuple in the case of include()..
— Deleet

2

이것이 Django 1.11이있는 Python 3.6의 DEBUG = False 모드에서 이미지 렌더링을 수행하기 위해 수행 한 작업입니다.

from django.views.static import serve
urlpatterns = [
url(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}),
# other paths
]

2

디버그 모드의 경우 => 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

장고 1.10의 경우 :

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

0

당신의 설정은 괜찮습니다. 일부 웹 서버는 미디어 및 정적 폴더 파일을 구체적으로 지정해야합니다. 예를 들어 pythonanywhere.com에서는 '웹'섹션으로 이동하여 URL 및 미디어 폴더 및 정적 폴더를 추가해야합니다. 예를 들면 다음과 같습니다.

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

나는 늦었지만 같은 문제 때문에이 링크를 방문하는 사람들을 돕기 위해;)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.