Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django display 404 on missing template

I have a website where some pages are edited by hand. When one of those templates is missing, it just means that the page is not present, so I would like to display an Error 404.

Instead I get an exception TemplateDoesNotExist.

Is there a way to tell Django to display an error 404 whenever it does not find a template?

like image 499
Andrea Avatar asked May 08 '11 08:05

Andrea


1 Answers

If you want this behaviour for all views on your site, you might want to write your own middleware with a process_exception method.

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)

If you have defined your own handler404 you would need to replace page_not_found above. I'm not immediately sure how you could convert the string handler404 into the callable required in the middleware..

To enable your middleware, add it to MIDDLEWARE_CLASSES in settings.py. Be careful of the position where you add it. The standard Django middleware warning applies:

Again, middleware are run in reverse order during the response phase, which includes process_exception. If an exception middleware returns a response, the middleware classes above that middleware will not be called at all.

like image 159
Alasdair Avatar answered Oct 19 '22 19:10

Alasdair