Django, creating a custom 500/404 error page Django, creating a custom 500/404 error page python python

Django, creating a custom 500/404 error page


Under your main views.py add your own custom implementation of the following two views, and just set up the templates 404.html and 500.html with what you want to display.

With this solution, no custom code needs to be added to urls.py

Here's the code:

from django.shortcuts import render_to_responsefrom django.template import RequestContextdef handler404(request, *args, **argv):    response = render_to_response('404.html', {},                                  context_instance=RequestContext(request))    response.status_code = 404    return responsedef handler500(request, *args, **argv):    response = render_to_response('500.html', {},                                  context_instance=RequestContext(request))    response.status_code = 500    return response

Update

handler404 and handler500 are exported Django string configuration variables found in django/conf/urls/__init__.py. That is why the above config works.

To get the above config to work, you should define the following variables in your urls.py file and point the exported Django variables to the string Python path of where these Django functional views are defined, like so:

# project/urls.pyhandler404 = 'my_app.views.handler404'handler500 = 'my_app.views.handler500'

Update for Django 2.0

Signatures for handler views were changed in Django 2.0:https://docs.djangoproject.com/en/2.0/ref/views/#error-views

If you use views as above, handler404 will fail with message:

"handler404() got an unexpected keyword argument 'exception'"

In such case modify your views like this:

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


Official answer:

Here is the link to the official documentation on how to set up custom error views:

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

It says to add lines like these in your URLconf (setting them anywhere else will have no effect):

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'

You can also customise the CSRF error view by modifying the setting CSRF_FAILURE_VIEW.

Default error handlers:

It's worth reading the documentation of the default error handlers, page_not_found, server_error, permission_denied and bad_request. By default, they use these templates if they can find them, respectively: 404.html, 500.html, 403.html, and 400.html.

So if all you want to do is make pretty error pages, just create those files in a TEMPLATE_DIRS directory, you don't need to edit URLConf at all. Read the documentation to see which context variables are available.

In Django 1.10 and later, the default CSRF error view uses the template 403_csrf.html.

Gotcha:

Don't forget that DEBUG must be set to False for these to work, otherwise, the normal debug handlers will be used.


Add these lines in 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'# ...

and implement our custom views in views.py.

views.py

from django.shortcuts import (render_to_response)from django.template import RequestContext# HTTP Error 400def bad_request(request):    response = render_to_response(        '400.html',        context_instance=RequestContext(request)        )        response.status_code = 400        return response# ...