DEBUG = झूठी सेटिंग मेरी django Static Files Access को विफल क्यों करती है?


356

मेरे काम के रूप में Django का उपयोग कर एक app का निर्माण कर रहा हूँ। सभी अब तक अच्छी तरह से निर्दिष्ट db सेटिंग्स, स्थिर निर्देशिकाओं, यूआरएल, विचारों आदि को कॉन्फ़िगर किया गया है, लेकिन मुसीबत उस क्षण में चुपके से शुरू हुई जब मैं अपने सुंदर और कस्टम 404.html और 500.html पृष्ठों को प्रस्तुत करना चाहता था।

मैंने कस्टम त्रुटि से निपटने पर डॉक्स पढ़े, और UrlsConf में आवश्यक कॉन्फ़िगरेशन सेट किए, संगत विचार बनाए और 404.html और 500.html को मेरे ऐप के टेम्प्लेट डायरेक्टरी (सेटिंग में भी निर्दिष्ट किया गया) में जोड़ा।

लेकिन डॉक्स का कहना है you can actually view custom error views until Debug is Off, इसलिए मैंने अपने सामान का परीक्षण करने के लिए इसे बंद कर दिया, और जब सामान बोर हो जाता है!

न केवल मैं कस्टम 404.html (वास्तव में, यह लोड होता है, लेकिन यह देखने में विफल रहता हूं, क्योंकि मेरे त्रुटि पृष्ठों में प्रत्येक में एक ग्राफिक त्रुटि संदेश है-कुछ अच्छी छवि है), त्रुटि पृष्ठ का स्रोत लोड होता है, लेकिन कुछ और लोड नहीं होता है! लिंक सीएसएस या जावास्क्रिप्ट भी नहीं!

आम तौर पर, एक बार जब मैं सेट करता हूं DEBUG = False, तो सभी दृश्य लोड हो जाएंगे, लेकिन कोई भी लिंक की गई सामग्री (CSS, जावास्क्रिप्ट, इमेजेज आदि) अभ्यस्त लोड नहीं होगी! क्या हो रहा है? क्या स्टैटिक फाइल्स और DEBUGसेटिंग के संबंध में कुछ याद आ रहा है ?


आप कैसे होस्ट कर रहे हैं? परीक्षण सर्वर के साथ स्थानीय मशीन?
j_syk

परीक्षण सर्वर के साथ स्थानीय मशीन। मैं मूल रूप से यह देखना चाहता हूं कि स्थानीय रूप से अनुकरण करने वाले परिदृश्यों जैसे कि गैर-मौजूदा पृष्ठों तक पहुंचने और रन-टाइम त्रुटियों के कारण - लेकिन मेरी स्थिर सामग्री अभ्यस्त लोड के कारण मेरी कस्टम त्रुटि हैंडलिंग कैसे काम करेगी।
nemesisfixx

या तो इसे यहाँ की तरह सर्वर लेवल पर किया जा सकता है या इसे urlpattern जोड़कर Django लेवल पर हैंडल किया जा सकता है। मैंने उसी समस्या के लिए यह नीचे प्रश्न पाया। stackoverflow.com/questions/6405173/…
पंकज आनंद

जवाबों:


353

डिबग के साथ बंद Django आप किसी भी अधिक के लिए स्थिर फ़ाइलों को संभाल नहीं होगा - अपने उत्पादन वेब सर्वर (Apache या कुछ) उस का ख्याल रखना चाहिए।


3
यह वास्तव में मेरी जिज्ञासा को सुलझाता है, इसलिए अब यह समझ में आता है, और मैं वास्तव में अपाचे के साथ इसकी देखभाल कर सकता हूं यदि आवश्यकता हो तो। मुझे लगा कि यह मेरी अपनी सेटिंग की समस्या है। धन्यवाद
nemesisfixx

5
मुझे यह उत्तर बहुत मददगार लगा। बस अगर कोई और मेरी उसी स्थिति में है (Google ऐप इंजन का उपयोग गैर-डीजंगो के साथ ऐप के लिए): app.yaml को अपडेट करना न भूलें।
लिंडसे फर्ग्यूसन

3
हैंडलर: - url: / static static_dir: static
Lyndsey Ferguson

475

यदि आपको अभी भी स्थानीय रूप से सर्वर को स्थिर करने की आवश्यकता है (उदाहरण के लिए डिबग के बिना परीक्षण के लिए) तो आप असुरक्षित मोड में डेस्ज़र चला सकते हैं:

manage.py runserver --insecure

6
जब भी यह ध्वज काम करता है, यह सामूहिक फ़ोल्डर से सामग्री की सेवा नहीं करता है
होवी

5
वह जादू है। धन्यवाद सर, आप हीरो हैं। इस उत्तर को स्वीकार किए गए उत्तर के साथ मिला देना चाहिए क्योंकि यह समस्या को हल करता है, जबकि स्वयं django की तुलना में दूसरे तरीके का उपयोग करके स्थैतिक सेवा करने की आवश्यकता नहीं है।
डेपो

1
मुझे बस यही चाहिए था। यद्यपि विकास और उत्पादन पर्यावरण और डिबग टॉगल के बीच अंतर करने के लिए पर्यावरण चर का उपयोग करना सबसे अच्छा अभ्यास होगा।
नीरज गुप्ता

1
कृपया ध्यान दें: यह ManifestStaticFilesStorage के साथ काम नहीं करेगा। code.djangoproject.com/ticket/19295
Andrea Rabbaglietti

9
क्या कोई मुझे बता सकता है कि इस बारे में इतना असुरक्षित क्या है
कवि वैद्य

36

आप उत्पादन में स्थिर फ़ाइलों की सेवा करने के लिए व्हाइटनोईस का उपयोग कर सकते हैं ।

इंस्टॉल:

pip install WhiteNoise

और अपनी wsgi.py फ़ाइल को इसमें बदलें :

from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise

application = get_wsgi_application()
application = DjangoWhiteNoise(application)

और आप जाने के लिए अच्छा कर रहे हैं!

हैंडलबार क्रिएटिव ब्लॉग का श्रेय ।

लेकिन, यह वास्तव में उत्पादन में इस तरह स्थिर फ़ाइलों की सेवा की सिफारिश नहीं है। आपके प्रोडक्शन वेब सर्वर (जैसे नेग्नेक्स) को इसका ध्यान रखना चाहिए।


1
दिलचस्प लगता है, लेकिन सिर्फ wgsi.pyफ़ाइल में उस लाइन को जोड़कर मेरे लिए काम नहीं किया । आपके द्वारा जोड़ा गया दस्तावेज़ व्हाइटनॉइस का उपयोग करने के लिए अन्य निर्देश देता है। अन्य तरीकों की कोशिश करेंगे और आपको यहां अपडेट करेंगे।
DarkCygnus

+1 जैसा कि आखिरकार इसने मुझे समाधान के लिए प्रेरित किया। मैंने एक उत्तर जोड़ा, जहां मैंने वास्तव में इसे काम करने के लिए उठाए गए अतिरिक्त कदम शामिल किए।
डार्ककाइग्नस

manage.py runserver --insecureमेरे लिए काम नहीं किया। यह एक करता है, यद्यपि।
जी

3
ध्यान दें कि व्हाइटनीज़ रिलीज़ 4.0 के साथ, कॉन्फ़िगरेशन बदल गया। इन पंक्तियों को wsgi.py पर न जोड़ें। इसके बजाय, सिर्फ 'whitenoise.middleware.WhiteNoiseMiddleware'मिडलवेयर में जोड़ें । चैंज से जारी नोट देखें
डौग हैरिस

क्यों अनुशंसित नहीं है? मैं इसे कई साइटों में वर्षों से उपयोग कर रहा हूं, बहुत अच्छा काम करता है। यहां तक ​​कि हरोकू अपने Django टेम्पलेट में इसका उपयोग करता है।
उमर गोंजालेज

32

Urls.py में मैंने यह पंक्ति जोड़ी:

from django.views.static import serve 

उन दो यूआरएल को urlpatterns में जोड़ें:

url(r'^media/(?P<path>.*)$', serve,{'document_root': settings.MEDIA_ROOT}), 
url(r'^static/(?P<path>.*)$', serve,{'document_root': settings.STATIC_ROOT}), 

DEBUG = FALSE के दौरान स्थिर और मीडिया दोनों ही फाइलें प्रशंसनीय थीं।
आशा है ये मदद करेगा :)


जब यह किया व्यवस्थापक पैनल css लोड नहीं हो रहा है ??
तृप्ति दीपाल

हाँ। एक ही काम करता है !! धन्यवाद।
DrGeneral

बहुत बढ़िया! STATIC_ROOT और manage.py एकत्रीकरण सेट करना न भूलें।
डोमिंगोआर

2
आजकल की जगह url(के साथre_path(
Leopd

19

यदि आप विकास में स्थिर सेवा दृश्य का उपयोग कर रहे हैं, तो आपके पास DEBUG = True होना चाहिए:

चेतावनी

यह तभी काम करेगा जब DEBUG ट्रू हो।

ऐसा इसलिए है क्योंकि यह दृश्य घोर अक्षम है और शायद असुरक्षित है। यह केवल स्थानीय विकास के लिए है, और इसका उपयोग कभी भी उत्पादन में नहीं किया जाना चाहिए।

डॉक्स: डेवलपमेंट में स्टैटिक फाइल्स परोसना

संपादित करें: आप अपने 404 और 500 टेम्पलेट्स का परीक्षण करने के लिए कुछ यूआरएल जोड़ सकते हैं, बस अपने यूआरएल में जेनेरिक दृश्य direct_to_template का उपयोग करें।

from django.views.generic.simple import direct_to_template

urlpatterns = patterns('',
    ('^404testing/$', direct_to_template, {'template': '404.html'})
)

1
एक कैसे करता है, फिर उत्पादन पर स्थिर फ़ाइलों की सेवा करता है? एनवीएम, मैंने अभी देखा। धन्यवाद।

आप एक विशिष्ट निर्देशिका को होस्ट करने के लिए अपना वेब सर्वर सेट करेंगे। आमतौर पर आप Apache या Nginx का उपयोग कर रहे होंगे। डॉक्स इसमें थोड़े जाते हैं।
j_syk

धन्यवाद @j_syk, मैं पहले से ही 404.html और 500.html देखने के इस दृष्टिकोण की कोशिश कर चुका हूँ, कुछ यू-नॉन-एरर मैकेनिज़्म जैसे कि यू क्या सुझाव देते हैं। लेकिन मैं जानना चाहता था कि क्या मेरे पृष्ठों को सही तरीके से प्रस्तुत करना असंभव था क्योंकि वे उत्पादन में सही तरीके से प्रस्तुत करेंगे, जबकि अभी भी केवल मेरे परीक्षण सर्वर पर चल रहा है - जब डीबग ऑफ़ होता है तो अपाचे को स्टैटिक फ़ाइल को सौंपने का प्रतिनिधिमंडल मेरे लिए इसे सुलझाता है। योगदान के लिए धन्यवाद।
nemesisfixx

@mcememesis मुझे यकीन नहीं है कि वास्तव में क्या होगा- लेकिन TEMPLATE_DEBUG = गलत, और DEBUG = True सेट करने का प्रयास करें। यदि आप सुंदर त्रुटियों को बंद कर देते हैं, तो मुझे यकीन नहीं है कि यह 404/500 के बजाय टेम्पलेट पर जाता है
j_syk

उम्मीद की तरह, ऐसा करने से कोई सकारात्मक परिणाम नहीं मिला। लेकिन अभी भी धन्यवाद।
nemesisfixx

17

जॉनी का जवाब बहुत अच्छा है, लेकिन फिर भी मेरे लिए वहां वर्णित उन पंक्तियों को जोड़कर काम नहीं किया। उस उत्तर के आधार पर, वास्तव में मेरे लिए काम करने वाले चरण जहाँ:

  1. वर्णित के रूप में व्हाइटनॉयस स्थापित करें :

    pip install WhiteNoise
  2. STATIC_ROOTवैरिएबल बनाएं और अपने MIDDLEWAREवैरिएबल में WhiteNoise जोड़ें settings.py:

    #settings.py
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'whitenoise.middleware.WhiteNoiseMiddleware', #add whitenoise
        'django.contrib.sessions.middleware.SessionMiddleware',
        ...
    ]
    
    #...
    
    STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') ##specify static root
  3. फिर, wsgi.pyजॉनी के उत्तर में बताई गई अपनी फ़ाइल को संशोधित करें :

    #wsgi.py
    from django.core.wsgi import get_wsgi_application
    from whitenoise.django import DjangoWhiteNoise
    
    application = get_wsgi_application()
    application = DjangoWhiteNoise(application)
  4. उसके बाद, अपने सर्वर (परिवर्तन या आप जो भी उपयोग करते हैं) के साथ अपने परिवर्तनों को तैनात करें।

  5. अंत में, अपने सर्वर collectstaticसे अपने विकल्प को चलाएं manage.py। यह आपके द्वारा STATIC_ROOTबताए गए डायरेक्टरी में आपके स्टैटिक फोल्डर की सभी फाइलों को कॉपी करेगा :

    $ python manage.py collectstatic

    अब आपको एक नया फ़ोल्डर दिखाई देगा जिसका नाम staticfilesऐसे तत्व हैं।

इन चरणों का पालन करने के बाद अब आप अपना सर्वर चला सकते हैं और उत्पादन मोड में रहते हुए अपनी स्थिर फ़ाइलों को देख पाएंगे।

अद्यतन: यदि आपके पास संस्करण <4 था, तो चैंज इंगित करता है कि अब WSGI_APPLICATION = 'projectName.wsgi.application'आपकी settings.pyफ़ाइल को घोषित करना आवश्यक नहीं है ।


मैंने इसे तदनुसार किया, और विकास पर यह ठीक काम किया, लेकिन उत्पादन में नहीं। अभी भी एक ही मुद्दा है जब DEBUG == झूठी
अन्ना हुआंग

@AnnaHuang विकास और उत्पादन में आपका क्या मतलब है? क्या आपके पास अलग वातावरण या मशीनें हैं? क्या वे उसी तरह कॉन्फ़िगर किए गए हैं?
डार्ककाइग्नस

13

आप वास्तव में एक उत्पादन Django एप्लिकेशन में स्थिर फ़ाइलों को सुरक्षित और बिना सेवा कर सकते हैं DEBUG=True

Django का उपयोग करने के बजाय, अपने WSGI फ़ाइल ( github ) में dj_static का उपयोग करें :

# requirements.txt:

...
dj-static==0.0.6


# YOURAPP/settings.py:

...
STATIC_ROOT = 'staticdir'
STATIC_URL = '/staticpath/'

# YOURAPP/wsgi.py:

...
from django.core.wsgi import get_wsgi_application
from dj_static import Cling

application = Cling(get_wsgi_application())

2
मैंने तब से वाइटेनोइस की खोज की है , जो अधिक पूर्ण विशेषताओं वाली हो सकती है।
रॉबिन विंसलो

7

बस अपने प्रोजेक्ट को urls.py खोलें, फिर इसे स्टेटमेंट के लिए खोजें।

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

आप सेटिंग्स को बदल सकते हैं। सच पर काम करें और यह हमेशा काम करेगा। लेकिन अगर आपकी परियोजना कुछ गंभीर है, तो आपको ऊपर वर्णित अन्य समाधानों के बारे में सोचना चाहिए।

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

Django 1.10 में आप ऐसा लिख ​​सकते हैं:

urlpatterns += [ url(r'^media/(?P<path>.*)$', serve, { 'document_root': settings.MEDIA_ROOT, }), url(r'^static/(?P<path>.*)$', serve, { 'document_root': settings.STATIC_ROOT }), ]

3
आपका कोड सही है, लेकिन Django 1.10 में, कॉन्फ़िगरेशन मीडिया और स्टेटिक के लिए है: urlpatterns + = [url (r '^ media / (? P <path>। *) $', सर्व करें, {'document_root: "सेटिंग। .MEDIA_ROOT,}), url (r '^ स्थैतिक / (? प <मार्ग>। *) $', परोसें, {'document_root': settings.STATIC_ROOT}),]
रॉबर्ट्स सोल्स

6

आप इसे कई अलग-अलग तरीकों से डिबग कर सकते हैं। यहाँ मेरा दृष्टिकोण है।

localsettings.py:

DEBUG = False
DEBUG404 = True

urls.py:

from django.conf import settings
import os

if settings.DEBUG404:
    urlpatterns += patterns('',
        (r'^static/(?P<path>.*)$', 'django.views.static.serve',
         {'document_root': os.path.join(os.path.dirname(__file__), 'static')} ),
    )

डॉक्स पढ़ना सुनिश्चित करें;)

https://docs.djangoproject.com/en/2.0/howto/static-files/#limiting-use-to-debug-true


0

Url () के लिए स्ट्रिंग दृश्य तर्कों के लिए समर्थन को हटा दिया गया है और इसे Django 1.10 में हटा दिया जाएगा

मेरा समाधान ऊपर कॉनराडो समाधान के लिए सिर्फ छोटा सुधार है।

from django.conf import settings
import os
from django.views.static import serve as staticserve

if settings.DEBUG404:
    urlpatterns += patterns('',
        (r'^static/(?P<path>.*)$', staticserve,
            {'document_root': os.path.join(os.path.dirname(__file__), 'static')} ),
        )

0

हालांकि यह सबसे सुरक्षित नहीं है, लेकिन आप स्रोत कोड में बदल सकते हैं। पर जाएPython/2.7/site-packages/django/conf/urls/static.py

फिर निम्नलिखित की तरह संपादित करें:

if settings.DEBUG or (prefix and '://' in prefix):

तो अगर settings.debug==Falseयह python manage.py runserver --runserverस्थिर फ़ाइलों को चलाने की कोशिश करने के बाद भी कोड पर असर नहीं करेगा ।

नोट : सूचना का उपयोग केवल परीक्षण के लिए किया जाना चाहिए


0

मैंने अपनी परियोजना / urls.py के लिए निम्नलिखित परिवर्तन किए और यह मेरे लिए काम किया

इस पंक्ति को जोड़ें: django.conf.urls से url आयात करें

और जोड़ें: urlpatterns में url (r '^ मीडिया / (P। *) $', परोसें, {'document_root': settings.MEDIA_ROOT,})।

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