Django, एक कस्टम 500/404 त्रुटि पेज बना रहा है


105

बिल्कुल यहाँ मिले ट्यूटोरियल के बाद , मैं एक कस्टम 500 या 404 त्रुटि पेज नहीं बना सकता। यदि मैं खराब यूआरएल में टाइप करता हूं, तो पेज मुझे डिफॉल्ट एरर पेज देता है। क्या ऐसा कुछ है जिसकी मुझे जाँच करनी चाहिए जो एक कस्टम पृष्ठ को दिखाने से रोकेगा?

फ़ाइल निर्देशिका:

mysite/
    mysite/
        __init__.py
        __init__.pyc
        settings.py
        settings.pyc
        urls.py
        urls.pyc
        wsgi.py
        wsgi.pyc
    polls/
        templates/
            admin/
                base_site.html
            404.html
            500.html
            polls/
                detail.html
                index.html
        __init__.py
        __init__.pyc
        admin.py
        admin.pyc
        models.py
        models.pyc
        tests.py
        urls.py
        urls.pyc
        view.py
        views.pyc
    templates/
    manage.py

mysite / settings.py में मेरे पास ये सक्षम हैं:

DEBUG = False
TEMPLATE_DEBUG = DEBUG

#....

TEMPLATE_DIRS = (
    'C:/Users/Me/Django/mysite/templates', 
)

mysite / चुनाव / urls.py के भीतर:

from django.conf.urls import patterns, url

from polls import views

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'),
    url(r'^(?P<poll_id>\d+)/results/$', views.results, name='results'),
    url(r'^(?P<poll_id>\d+)/vote/$', views.vote, name='vote'),
)

मैं किसी भी अन्य कोड को आवश्यक पोस्ट कर सकता हूं, लेकिन अगर मैं खराब यूआरएल का उपयोग करता हूं तो मुझे कस्टम 500 त्रुटि पृष्ठ पाने के लिए क्या बदलना चाहिए?

संपादित करें

समाधान: मेरे पास एक अतिरिक्त था

TEMPLATE_DIRS

मेरी सेटिंग के भीतर और वह समस्या पैदा कर रहा था


1
डिबग ने मेरे कोड में झूठा सेट किया है
Zac

यह आपकी मदद कर सकता है stackoverflow.com/a/12180499/1628832
कार्तिक

1
केवल कस्टम टेम्पलेट बनाने के तरीके की तलाश करते हुए यह उत्तर मिला और मैं थोड़ा Django प्रलेखन साझा करना चाहता था जिससे मुझे बहुत मदद मिली; docs.djangoproject.com/en/1.7/ref/views/…
Blackeagle52

मेरा खाका बिना template_dirs सेटिंग के काम करता है।
प्रोग्रामिंग।

1
जब पहली पंक्ति में लिंक Django के 404 पृष्ठ की ओर जाता है तो विडंबना के लिए अंक। Django के एक संस्करण के लिए एक ट्यूटोरियल पेज की ओर जाता है जो मेरे विचार से मौजूद नहीं है। यहाँ Django 2.0 के लिए ट्यूटोरियल पेज का लिंक दिया गया है: docs.djangoproject.com/en/2.0/intro/tutorial03
andrewec

जवाबों:


120

अपने मुख्य के तहत views.pyनिम्नलिखित दो विचारों के अपने स्वयं के कस्टम कार्यान्वयन को जोड़ें, और जो आप प्रदर्शित करना चाहते हैं उसके साथ बस 404.html और 500.html टेम्पलेट सेट करें ।

इस समाधान के साथ, कोई कस्टम कोड जोड़ने की आवश्यकता नहीं है urls.py

यहाँ कोड है:

from django.shortcuts import render_to_response
from django.template import RequestContext


def handler404(request, *args, **argv):
    response = render_to_response('404.html', {},
                                  context_instance=RequestContext(request))
    response.status_code = 404
    return response


def handler500(request, *args, **argv):
    response = render_to_response('500.html', {},
                                  context_instance=RequestContext(request))
    response.status_code = 500
    return response

अपडेट करें

handler404और handler500निर्यात Django स्ट्रिंग विन्यास चर में पाए जाते हैं django/conf/urls/__init__.py। यही कारण है कि उपरोक्त कॉन्फ़िगरेशन काम करता है।

काम करने के लिए उपरोक्त विन्यास प्राप्त करने के लिए, आपको अपनी urls.pyफ़ाइल में निम्नलिखित चर को परिभाषित करना चाहिए और निर्यात किए गए Django चर को स्ट्रिंग पायथन पथ में इंगित करना चाहिए जहां ये Django कार्यात्मक विचार परिभाषित किए गए हैं, जैसे:

# project/urls.py

handler404 = 'my_app.views.handler404'
handler500 = 'my_app.views.handler500'

Django 2.0 के लिए अद्यतन

Django 2.0 में हैंडलर विचारों के लिए हस्ताक्षर बदल दिए गए थे: https://docs.djangoproject.com/en/2.0/ref/views/#error-views

यदि आप ऊपर दिए गए विचारों का उपयोग करते हैं, तो handler404 संदेश के साथ विफल हो जाएगा:

"हैंडलर404 () को एक अप्रत्याशित कीवर्ड तर्क 'अपवाद' मिला"

ऐसे मामले में अपने विचारों को इस तरह से संशोधित करें:

def handler404(request, exception, template_name="404.html"):
    response = render_to_response(template_name)
    response.status_code = 404
    return response

यह मेरे लिए काफी अच्छा काम कर रहा था, लेकिन किसी कारण से request.user 404 टेम्पलेट में ठीक प्रतीत होता है, लेकिन 500 टेम्पलेट में बिल्कुल भी नहीं (और वे लगभग समान हैं) - इस पर यहां प्रश्न पोस्ट किया गया: stackoverflow.com/ प्रश्न / २६०४३२११ /…
ग्रेव ग्रेव

1
एक और बात मैं सोच रहा था - क्या होगा अगर आप व्यवस्थापक बैकएंड का उपयोग करते हैं और उन के लिए अलग टेम्पलेट का उपयोग करना चाहते हैं? मेरी जानकारी के अनुसार, व्यवस्थापक के पास इस कोड को ओवरराइड करने और डालने के लिए एक व्यूहोम नहीं है।
ग्रेविटी ग्रेव

11
@ ग्रेविटीग्रेव 500 templateप्रस्तुत नहीं करेगा request.userक्योंकि यह 500 सर्वर त्रुटि की सूचना दे रहा है, इसलिए सर्वर कुछ भी सेवा करने में सक्षम नहीं है।
आरोन लेलेयर

5
Django 1.9 के साथ मेरे लिए काम नहीं किया; (शायद मैं कुछ गलत कर रहा हूं। क्या हैंडलर404 django आरक्षित नाम है? Django को कैसे पता चलेगा कि यह बिल्कुल उसी दृश्य को कॉल करना चाहिए?
deathangel908

1
मैंने आपकी टिप्पणी के आधार पर उत्तर को अपडेट किया। क्षमा करें कि अपडेट में इतनी देर है। मुझे आशा है की इससे मदद मिलेगी।
हारून लेलेयर

71

आधिकारिक उत्तर:

कस्टम त्रुटि दृश्य सेट करने के तरीके के बारे में आधिकारिक दस्तावेज़ों का लिंक यहां दिया गया है:

https://docs.djangoproject.com/en/stable/topics/http/views/#customizing-error-views

यह आपके URLconf में इनकी तरह लाइनें जोड़ने के लिए कहता है (इन्हें कहीं और स्थापित करने से कोई प्रभाव नहीं पड़ेगा):

handler404 = 'mysite.views.my_custom_page_not_found_view'
handler500 = 'mysite.views.my_custom_error_view'
handler403 = 'mysite.views.my_custom_permission_denied_view'
handler400 = 'mysite.views.my_custom_bad_request_view'

आप सेटिंग को संशोधित करके CSRF त्रुटि दृश्य को भी अनुकूलित कर सकते हैं CSRF_FAILURE_VIEW

डिफ़ॉल्ट त्रुटि हैंडलर:

यह डिफ़ॉल्ट त्रुटि संचालकों , और page_not_found, के प्रलेखन को पढ़ने के लायक है । डिफ़ॉल्ट रूप से, वे इन खाकों यदि वे उन्हें क्रमश: प्राप्त कर सकते हैं का उपयोग करें: , , , और ।server_errorpermission_deniedbad_request404.html500.html403.html400.html

इसलिए यदि आप सभी करना चाहते हैं तो बहुत त्रुटि वाले पृष्ठ बनाएं, बस उन फ़ाइलों को एक TEMPLATE_DIRSनिर्देशिका में बनाएं , आपको URLConf को संपादित करने की आवश्यकता नहीं है। कौन से संदर्भ चर उपलब्ध हैं, यह देखने के लिए दस्तावेज़ीकरण पढ़ें।

Django 1.10 और बाद में, डिफ़ॉल्ट CSRF त्रुटि दृश्य टेम्पलेट का उपयोग करता है 403_csrf.html

पकड़ लिया:

यह मत भूलो कि DEBUGइन्हें काम करने के लिए गलत पर सेट किया जाना चाहिए, अन्यथा, सामान्य डीबग हैंडलर का उपयोग किया जाएगा।


1
मैंने जोड़ा था, लेकिन यह काम नहीं करता है। मेरे विचार में सही स्थानों की ओर इशारा करते हुए हैंडलर404 और अन्य को जोड़ा, फिर भी यह काम नहीं करता है, फिर भी डिफ़ॉल्ट 404 को देख रहा है। और हां, मैं डिबग फाल्स मोड में हूं और 1.9 का उपयोग कर रहा हूं
खोपी

Django 1.9 का उपयोग करना और केवल 500.html आदि टेम्पलेट्स जोड़ना मानक पृष्ठों के बजाय उन्हें दिखाता है। अच्छा आसान तय।
curtisp

2
गोत्र ने मेरी मदद की। मेरी सेटिंग में ये परिवर्तन करके काम किया, किसी भी क्लाइंट से http अनुरोध स्वीकार करने के लिए DEBUG = गलत और ALLOWED_HOSTS = ['0.0.0.0'] सेट करें।
शफू

1
बस किसी और को आश्चर्य हो रहा है कि पृथ्वी पर URLconf कहाँ है, यहाँ यह है
आर्थर

38

इन पंक्तियों को urls.py में जोड़ें

urls.py

from django.conf.urls import (
handler400, handler403, handler404, handler500
)

handler400 = 'my_app.views.bad_request'
handler403 = 'my_app.views.permission_denied'
handler404 = 'my_app.views.page_not_found'
handler500 = 'my_app.views.server_error'

# ...

और हमारे कस्टम विचारों को view.py में कार्यान्वित करें।

views.py

from django.shortcuts import (
render_to_response
)
from django.template import RequestContext

# HTTP Error 400
def bad_request(request):
    response = render_to_response(
        '400.html',
        context_instance=RequestContext(request)
        )

        response.status_code = 400

        return response

# ...

5
आप handler400इसे केवल ओवरराइट करने के लिए आयात क्यों करेंगे handler400 = 'myapp.views.bad_request'?
फ्लिम


5
आपको उन्हें ओवरराइड करने के लिए यहां हैंडलर आयात करने की आवश्यकता नहीं है।
फनकोटॉन

1
आपको उपयोग नहीं करना चाहिए render_to_response। डॉक्स से: "यह अनुशंसित नहीं है और भविष्य में इसके पदावनत होने की संभावना है।"
टिम्मी ओ'मोनी

Django 1.10 के लिए, जैसा render_to_responseकि render
वंचित

21

आपके द्वारा संदर्भित पृष्ठ से:

जब आप एक दृश्य के भीतर से Http404 बढ़ाते हैं, तो Django 404 त्रुटियों से निपटने के लिए समर्पित एक विशेष दृश्य लोड करेगा। यह आपके रूट URLconf (और केवल आपके रूट URLconf में चर handler404 की तलाश करके इसे ढूंढता है, हैंडलर404 को कहीं और स्थापित करने का कोई प्रभाव नहीं होगा), जो Python डॉटेड सिंटैक्स में एक स्ट्रिंग है - सामान्य URLconf कॉलबैक का उपयोग करता है। एक 404 दृश्य में ही कुछ खास नहीं है: यह सिर्फ एक सामान्य दृश्य है।

इसलिए मेरा मानना ​​है कि आपको अपने urls.py पर ऐसा कुछ जोड़ने की आवश्यकता है:

handler404 = 'views.my_404_view'

और हैंडलर 500 के लिए समान है।


माइक कैसा दिखता है? आज मेरा पहला दिन Django का उपयोग कर रहा है और मैं अभी भी रस्सियों पर लटका रहा हूं
Zac

2
@JimRilye आपको अपने विचारों में एक उपयुक्त 500 फ़ंक्शन जोड़ना होगा, और फिर उस चर के साथ संदर्भ देना होगा। इसलिए, अपनी urlpatterns = ...रेखा के ऊपर , एक पंक्ति जोड़ें जो कहती है handler500 = 'views.handle500', और फिर def handle500(request):अपने दृष्टिकोण में जोड़ें जो आपका 500.html प्रदर्शित करता है।
माइक पेले

18

अगर आपको केवल कस्टम पेज दिखाने की ज़रूरत है, जिसमें आपकी साइट के लिए कुछ फैंसी त्रुटि संदेश हैं DEBUG = False, तो अपनी टेम्प्लेट डायरेक्टरी में 404.html और 500.html नाम के दो टेम्प्लेट जोड़ें और 404 या 500 होने पर यह स्वतः ही इस कस्टम पेज को चुन लेगा। उठाया है।


1
यह काम सिर्फ यह सुनिश्चित करता है कि आपके पास कुछ ऐसा हो: 'DIRS': [os.path.join(BASE_DIR, '<project_name>/templates')]अपनी TEMPLATES सूची में settings.py
eric

12

में Django 2. * आप में इस निर्माण का उपयोग कर सकते views.py

def handler404(request, exception):
    return render(request, 'errors/404.html', locals())

में settings.py

DEBUG = False

if DEBUG is False:
    ALLOWED_HOSTS = [
        '127.0.0.1:8000',
        '*',
    ]

if DEBUG is True:
    ALLOWED_HOSTS = []

में urls.py

# https://docs.djangoproject.com/en/2.0/topics/http/views/#customizing-error-views
handler404 = 'YOUR_APP_NAME.views.handler404'

आमतौर पर मैं default_app बनाता हूं और साइट-वाइड एरर को संभालता हूं , इसमें संदर्भ प्रोसेसर।


मेरे लिए काम। लेकिन क्या है exception?
zeleven

प्रलेखन लिंक के अनुसार: docs.djangoproject.com/en/2.1/ref/urls/… । यह लिखा है: सुनिश्चित करें कि हैंडलर अनुरोध और अपवाद तर्क स्वीकार करता है
अलौनी यून्स

1
Django 3.0 में मेरे लिए काम किया । लेकिन क्या है locals()? फ़ाइल केवल दिखाती है pass
ENCHANCE

9

settings.py:

DEBUG = False
TEMPLATE_DEBUG = DEBUG
ALLOWED_HOSTS = ['localhost']  #provide your host name

और बस अपने 404.htmlऔर 500.htmlपृष्ठों को टेम्पलेट फ़ोल्डर में जोड़ें । निकालें 404.htmlऔर 500.htmlचुनाव ऐप में टेम्प्लेट से।


संदेश का उपयोग कैसे करें raise Http404('msg'): stackoverflow.com/a/37109914/895245 {{ request_path }} भी उपलब्ध है।
सिरो सेंटिल्ली 郝海东 冠状 iro i 法轮功 '


7

एक त्रुटि करें, त्रुटि पृष्ठ पर पता लगाएं कि django कहाँ से टेम्प्लेट लोड कर रहा है। मेरा मतलब है कि स्टैक। आधार टेम्पलेट_ dir में ये html पृष्ठ 500.html , 404.html जोड़ें । जब ये त्रुटियां होती हैं तो संबंधित टेम्प्लेट फाइलें अपने आप लोड हो जाएंगी।

आप अन्य त्रुटि कोड के लिए भी पेज जोड़ सकते हैं, जैसे 400 और 403

उममीद है कि इससे मदद मिलेगी !!!


6

Django में 3.x, स्वीकृत जवाब काम नहीं करेगा क्योंकि render_to_responseपूरी तरह से हटा दिया गया है और साथ ही कुछ और बदलाव किए गए हैं क्योंकि संस्करण के लिए स्वीकार किए गए उत्तर ने काम किया है।

कुछ अन्य उत्तर भी हैं, लेकिन मैं थोड़ा क्लीनर उत्तर प्रस्तुत कर रहा हूं:

आपकी मुख्य urls.pyफ़ाइल में:

handler404 = 'yourapp.views.handler404'
handler500 = 'yourapp.views.handler500'

में yourapp/views.pyफ़ाइल:

def handler404(request, exception):
    context = {}
    response = render(request, "pages/errors/404.html", context=context)
    response.status_code = 404
    return response


def handler500(request):
    context = {}
    response = render(request, "pages/errors/500.html", context=context)
    response.status_code = 500
    return response

सुनिश्चित करें कि आपने फ़ाइल render()में आयात किया yourapp/views.pyहै:

from django.shortcuts import render

साइड नोट: render_to_response()Django में पदावनत किया गया था 2.xऔर इसे पूरी तरह से हटा दिया गया है 3.x


5

एक सिंगल लाइन के रूप में (404 जेनेरिक पेज के लिए):

from django.shortcuts import render_to_response
from django.template import RequestContext

return render_to_response('error/404.html', {'exception': ex},
                                      context_instance=RequestContext(request), status=404)

1
और इसका उपयोग कहां करें?
सामी

4
# views.py
def handler404(request, exception):
    context = RequestContext(request)
    err_code = 404
    response = render_to_response('404.html', {"code":err_code}, context)
    response.status_code = 404
    return response

# <project_folder>.urls.py
handler404 = 'todo.views.handler404' 

यह django 2.0 पर काम करता है

404.htmlऐप टेम्पलेट फ़ोल्डर के अंदर अपने कस्टम को शामिल करना सुनिश्चित करें ।


4

Django 3.0

यहाँ लिंक है कि त्रुटि विचारों को कैसे अनुकूलित किया जाए

यहाँ लिंक कैसे एक दृश्य प्रस्तुत करना है

, urls.py(मुख्य एक, प्रोजेक्ट फ़ोल्डर में), डाल:

handler404 = 'my_app_name.views.custom_page_not_found_view'
handler500 = 'my_app_name.views.custom_error_view'
handler403 = 'my_app_name.views.custom_permission_denied_view'
handler400 = 'my_app_name.views.custom_bad_request_view'

और उस एप्लिकेशन में ( my_app_name) views.py:

def custom_page_not_found_view(request, exception):
    return render(request, "errors/404.html", {})

def custom_error_view(request, exception=None):
    return render(request, "errors/500.html", {})

def custom_permission_denied_view(request, exception=None):
    return render(request, "errors/403.html", {})

def custom_bad_request_view(request, exception=None):
    return render(request, "errors/400.html", {})

नोट: error/404.htmlयदि आप अपनी फ़ाइलों को प्रोजेक्ट्स में (ऐप्स नहीं) टेम्पलेट फ़ोल्डर में रखते हैं, templates/errors/404.htmlतो कृपया उन फ़ाइलों को रखें जहाँ आप चाहते हैं और सही पथ लिखें।

नोट 2: पृष्ठ पुनः लोड करने के बाद, यदि आप अभी भी पुराने टेम्प्लेट को देखते हैं, तो settings.py DEBUG=Trueइसे बदलें , इसे सहेजें, और फिर False(सर्वर को पुनरारंभ करने और नई फ़ाइलों को इकट्ठा करने के लिए)।


अतिरिक्त ध्यान दें: यदि आप DEUB=Falseअपनी स्थैतिक फाइलों में चल रहे हैं , तो उसे सेवा में नहीं लाया जा सकता है, जिससे आप अपने कस्टम त्रुटि टेम्प्लेट परिवर्तनों का पूर्वावलोकन नहीं कर सकते। ./manage.py runserver --insecureवैसे भी उन्हें सेवा करने के लिए बल django प्राप्त करने के लिए उपयोग करें ।
रोब

4

कोई अतिरिक्त दृश्य की आवश्यकता नहीं है। https://docs.djangoproject.com/en/3.0/ref/views/

टेम्प्लेट डायरेक्टरी के रूट में सिर्फ एरर फाइल रखें

  • 404.html
  • 400.html
  • 403.html
  • 500.html

और यह आपके त्रुटि पृष्ठ का उपयोग करना चाहिए जब डिबग गलत है


3

अपनी त्रुटि टेम्प्लेट को आगे बढ़ाने का प्रयास करें .../Django/mysite/templates/?

मैं इस बारे में निश्चित हूं, लेकिन मुझे लगता है कि ये वेबसाइट के लिए "वैश्विक" होने की आवश्यकता है।

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