장고 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_processorsTEMPLATE_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.