Search code examples
djangohttp-status-codeshttp-status-code-405

How to display a custom error page for HTTP status 405 (method not allowed) in Django when using @require_POST


My question is simple, how do I display a custom error page for HTTP status 405 (method not allowed) in Django when using the @require_POST decorator?

I'm using the django.views.decorators.http.require_POST decorator, and when the page is visited by GET request, the console shows a 405 error, but the page is just blank (not even a Django error page). How do I get Django to display a custom and/or default error page for this kind of error?

EDIT: It's worth mentioning that I've tried putting a 404.html, 500.html and 405.html page in my templates folder - but that does not help either. I have also varied between DEBUG = True and False, to no avail.


Solution

  • You have to write custom Django middleware. You can start with this one and extend it to check if 405.html file exists and so on:

    from django.http import HttpResponseNotAllowed
    from django.template import RequestContext
    from django.template import loader
    
    
    class HttpResponseNotAllowedMiddleware(object):
        def process_response(self, request, response):
            if isinstance(response, HttpResponseNotAllowed):
                context = RequestContext(request)
                response.content = loader.render_to_string("405.html", context_instance=context)
            return response
    

    Check docs if you don't know how to install middleware:

    http://docs.djangoproject.com/en/dev/topics/http/middleware/

    You can also check this article:

    http://mitchfournier.com/2010/07/12/show-a-custom-403-forbidden-error-page-in-django/