2011-05-08 10 views
9

मेरे पास एक ऐसी वेबसाइट है जहां कुछ पेज हाथ से संपादित किए जाते हैं। जब उनमें से एक टेम्पलेट गुम हो जाता है, तो इसका मतलब यह है कि पृष्ठ मौजूद नहीं है, इसलिए मैं एक त्रुटि 404 प्रदर्शित करना चाहता हूं।Django लापता टेम्पलेट पर 404 प्रदर्शित करता है

इसके बजाय मुझे एक अपवाद टेम्पलेट डोज़ॉटऑक्सिस्ट प्राप्त होता है।

क्या Django को कोई त्रुटि टेम्पलेट नहीं मिलने पर त्रुटि 404 प्रदर्शित करने का कोई तरीका है?

उत्तर

12

आप अपनी साइट पर सभी दृश्यों के लिए इस व्यवहार चाहते हैं, आप शायद process_exception विधि के साथ अपना खुद का मिडलवेयर लिखना चाहें।

from django.template import TemplateDoesNotExist 
from django.views.defaults import page_not_found 

class TemplateDoesNotExistMiddleware(object): 
    """ 
    If this is enabled, the middleware will catch 
    TemplateDoesNotExist exceptions, and return a 404 
    response. 
    """ 

    def process_exception(self, request, exception): 
     if isinstance(exception, TemplateDoesNotExist): 
      return page_not_found(request) 

आप अपने खुद के निर्धारित किया है तो handler404 आप ऊपर page_not_found को बदलने के लिए की आवश्यकता होगी। मैं .. तुरंत यकीन है कि कैसे आप प्रतिदेय मिडलवेयर में आवश्यक में स्ट्रिंग handler404 परिवर्तित कर सकते हैं नहीं कर रहा हूँ

, अपने मिडलवेयर सक्षम करने के लिए settings.py में MIDDLEWARE_CLASSES में जोड़ें। उस स्थिति से सावधान रहें जहां आप इसे जोड़ते हैं। मानक डीजेगो मिडलवेयर चेतावनी लागू होती है:

फिर, प्रतिक्रिया चरण के दौरान मिडलवेयर रिवर्स ऑर्डर में चलाए जाते हैं, जिसमें process_exception शामिल है। यदि कोई अपवाद मिडलवेयर प्रतिक्रिया देता है, तो उस मिडलवेयर के ऊपर मिडलवेयर कक्षाओं को बिल्कुल भी नहीं बुलाया जाएगा।

9

ध्यान में रखते हुए प्रतिक्रिया की वापसी डाल एक में (या जहाँ भी टेम्पलेट प्रदान की गई है) ब्लॉक कोशिश को छोड़कर:

from django.http import Http404 
from django.shortcuts import render_to_response 
from django.template import TemplateDoesNotExist 

def the_view(request): 
    ... 
    try: 
     return render_to_response(...) 
    except TemplateDoesNotExist: 
     raise Http404 
+0

अपवाद आयात करने की आवश्यकता है: 'django.template आयात टेम्पलेट DoesNotExist' से। –

+0

अतिरिक्त के लिए धन्यवाद। मैं भूल जाता हूं कि अपवाद आयात करना है, क्योंकि जांच नहीं हो सका। जवाब संपादित किया। –

+0

हाँ, मुझे पता है कि मैं यह कर सकता हूं, लेकिन यह अल विचारों में कुछ बॉयलरप्लेट बन जाता है। मुझे उम्मीद थी कि ऐसा करने का एक वैश्विक तरीका था। – Andrea

-1

मेरे सिर के ऊपर से, लेकिन यदि आप अपनी सेटिंग्स में DEBUG = गलत सेट करते हैं, तो आपको 404 फिर प्रत्येक त्रुटि (टेम्पलेट नॉटफाउंड समेत) पर 404 नहीं मिलेगा?

+0

मुझे ऐसा लगता है, लेकिन मुझे परीक्षण के लिए इसकी आवश्यकता है। – Andrea

+2

यह उत्तर गलत है। त्रुटियों के लिए डिफ़ॉल्ट Django व्यवहार 'server_error' दृश्य को चलाने के लिए है, '500.html' टेम्पलेट प्रस्तुत करेगा और त्रुटि कोड 500 के साथ एक पृष्ठ वापस करेगा। Http://docs.djangoproject.com/en/dev/topics/ देखें http/विचारों/#-500-सर्वर त्रुटि-व्यू – Alasdair

संबंधित मुद्दे