Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to properly setup custom handler404 in django?

According to the documentation this should be fairly simple: I just need to define handler404. Currently I am doing, in my top urls.py:

urlpatterns = [
    ...
]

handler404 = 'myapp.views.handle_page_not_found'

The application is installed. The corresponding view is just (for the time being I just want to redirect to the homepage in case of 404):

def handle_page_not_found(request):
    return redirect('homepage')

But this has no effect: the standard (debug) 404 page is shown.

The documentation is a bit ambiguous:

  • where should handler404 be defined? The documentation says in the URLconf but, where exactly? I have several applications, each with a different urls.py. Can I put it in any of them? In the top URLconf? Why? Where is this documented?
  • what will be catched by this handler? Will it catch django.http.Http404, django.http.HttpResponseNotFound, django.http.HttpResponse (with status=404)?
like image 306
blueFast Avatar asked Feb 02 '16 14:02

blueFast


4 Answers

As we discussed, your setup is correct, but in settings.py you should make DEBUG=False. It's more of a production feature and won't work in development environment(unless you have DEBUG=False in dev machine of course).

like image 187
Shang Wang Avatar answered Nov 17 '22 10:11

Shang Wang


Debug should be False and add to view *args and **kwargs. Add to urls.py handler404 = 'view_404'

def view_404(request, *args, **kwargs):
return redirect('https://your-site/404')

If I didn't add args and kwargs server get 500.

like image 24
Pasha M Avatar answered Nov 17 '22 09:11

Pasha M


All the other answers were not up to date. Here's what worked for me in Django 3.1:

urls.py

from django.conf.urls import handler404, handler500, handler403, handler400
from your_app_name import views

handler404 = views.error_404
handler500 = views.error_500

views.py

def error_404(request, exception):
   context = {}
   return render(request,'admin/404.html', context)

def error_500(request):
   context = {}
   return render(request,'admin/500.html', context)

Note, you will have to edit this code to reflect your app name in the import statement in urls.py and the path to your html templates in views.py.

like image 20
devdrc Avatar answered Nov 17 '22 10:11

devdrc


To render 404 Error responses on a custom page, do the following:

In your project directory open settings.py and modify DEBUG as follows:

    DEBUG = False

In the same directory create a file and name it views.py, insert the following code:

   from django.shortcuts import render

   def handler404(request, exception):
       return render(request, 'shop/shop.html')

Finally open urls.py file which is in the same project directory and add the following code:

   from django.contrib import admin
   from . import views

   handler404 = views.handler404

   urlpatterns = [
      path('admin/', admin.site.urls),
   ]
like image 5
GilbertS Avatar answered Nov 17 '22 09:11

GilbertS