Django MEDIA_URL और MEDIA_ROOT


229

मैं Django व्यवस्थापक के माध्यम से एक छवि अपलोड करने का प्रयास कर रहा हूं और फिर उस छवि को किसी पृष्ठ पर या सामने वाले पृष्ठ पर या URL के माध्यम से देख सकता हूं।

ध्यान दें यह सब मेरे स्थानीय मशीन पर है।

मेरी सेटिंग्स इस प्रकार हैं:

MEDIA_ROOT = '/home/dan/mysite/media/'

MEDIA_URL = '/media/'

मैंने 'images' में upload_to पैरामीटर सेट किया है और फ़ाइल को निर्देशिका में सही तरीके से अपलोड किया गया है:

'/home/dan/mysite/media/images/myimage.png'

हालाँकि, जब मैं निम्न URL पर छवि को एक्सेस करने का प्रयास करता हूं:

http://127.0.0.1:8000/media/images/myimage.png

मुझे 404 त्रुटि मिलती है।

क्या मुझे अपलोड किए गए मीडिया के लिए विशिष्ट URLconf पेटेंट सेटअप करने की आवश्यकता है?

किसी भी सलाह की सराहना की।

धन्यवाद।

जवाबों:


293

Django> = 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क्योंकि Django यह सुनिश्चित करेगा कि यह केवल डिबग मोड में उपयोग किया जाए।


Django <= 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}))

इसके साथ आप Django से DEBUG = True(जब आप स्थानीय कंप्यूटर पर चलाते हैं) स्थैतिक मीडिया की सेवा कर सकते हैं, लेकिन जब आप उत्पादन पर जाते हैं तो आप अपने वेब सर्वर कॉन्फ़िगरेशन को स्थिर मीडिया की सेवा दे सकते हैं।DEBUG = False


14
पुनश्च। फिर आप इसे अपने टेम्प्लेट में उपयोग कर सकते हैं: <img src = "{{MEDIA_URL}} छवियां / myimage.png" />
मीका

मुझे नहीं लगता कि ^साइन इन करना पहले अच्छा है media//(?P<path>.*)$, कभी-कभी जब हम मीडिया फ़ाइल को ऐप यूआरएल पथ (जैसे http://127.0.0.1:8000/myapp/media/img/logo.png) में एक्सेस करते हैं , तो यह नियमित रूप से गणित नहीं करेगा।
जैक झांग

मैं 2 दिनों के लिए संघर्ष कर रहा हूं अब मेरी छवियां 404 क्यों लौट रही हैं। यह एकमात्र ऐसी चीज है जो मुझे याद आ रही है और मैं इसे Django डॉक्टर में नहीं पा सकता हूं। धन्यवाद।
तम्बलोलो

1
यदि आप Django 1.5+ का उपयोग कर रहे हैं, तो कृपया नीचे दिया गया उत्तर देखें; यह एक बेहतर उपाय है।
ठाणे ब्रिमहल

क्या यह आपके ऐप या प्रोजेक्ट 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

क्या यह अपाचे के साथ उत्पादन में इसका उपयोग करना ठीक है?
औरिलाबस

1
@ कंडी - नहीं इसका उत्पादन में इस तरह से उपयोग करने के लिए ठीक नहीं है। इसे आपके उत्पादन पर अपाचे के माध्यम से कॉन्फ़िगर किया जाना चाहिए।
विकास गुलाटी


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/#serves-files-uploaded-by-a-user-during-development


2
यह django> 1.9, thnks का समाधान है।
unixeO

13
बस यह सुनिश्चित करें कि यह आपके प्रोजेक्ट के urls.py में है और आपके ऐप का नहीं, मैंने गलती से क्या किया।
जर्नो

3
मेरे लिए भी 1.10 पर काम किया।
डेलेसेट

मेरे लिए काम नहीं करता है। शायद सेटिंग में कोई भी पुरानी अंतर्निहित सेटिंग्स हैं?
फ्यूजन

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>

आश्चर्य से समझाया - यह मेरे लिए जवाब था। कुंजी मीडिया संदर्भ प्रोसेसर को जोड़ रही थी ।
डेविड मैन्स

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
इसका क्या मतलब है कि आप सर्वर को कैसे कॉन्फ़िगर करते हैं?
एम हॉर्नबैकर

मुझे "पैटर्न" का एक अनसुलझा संदर्भ मिलता है, क्या यह कहीं से आयातित है?
user7804781

6

(कम से कम) Django 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 स्टेटमेंट से स्वतंत्र:

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- प्रकाशन ऐप के लिए 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 }}आपके टेम्प्लेट में काम नहीं करेगा। इसे ठीक करने के लिए, अपनी सेटिंग में , सुनिश्चित करें कि आप जोड़ते हैं

django.core.context_processors.media

अपने में TEMPLATE_CONTEXT_PROCESSORS


2

मीका कैरिक उत्तर को django 1.8 के लिए जोड़ना:

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().
डेलेसेट

2

यह वही है जो मैंने DEBUG में झूठी छवि प्रदान करने के लिए किया था = Django 1.11 के साथ पायथन 3.6 में गलत मोड

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


0

आपकी सेटिंग बिलकुल ठीक है। कुछ वेब सर्वर को विशेष रूप से मीडिया और स्थिर फ़ोल्डर फ़ाइलों को निर्दिष्ट करने की आवश्यकता होती है। उदाहरण के लिए pythonanywhere.com में आपको 'Web' सेक्शन में जाना होगा और url od को मीडिया फोल्डर और स्टैटिक फोल्डर को जोड़ना होगा। उदाहरण के लिए:

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

मुझे पता है कि यह देर हो चुकी है, लेकिन सिर्फ उसी समस्या की वजह से इस लिंक पर आने वालों की मदद करने के लिए;)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.