Как правильно настроить пользовательский обработчик404 в django?

Согласно документации это должно быть довольно просто: мне просто нужно определить handler404. В настоящее время я занимаюсь в своем верхнем urls.py:

urlpatterns = [
    ...
]

handler404 = 'myapp.views.handle_page_not_found'

Приложение установлено. Соответствующее представление просто (на данный момент я просто хочу перенаправить на главную страницу в случае 404):

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

Но это не влияет: отображается стандартная (отладочная) 404 страница.

Документация немного неоднозначна:

  • где должен быть определен handler404? Документация говорит в URLconf но где именно? У меня есть несколько приложений, каждый с другим urls.py Могу ли я поместить его в любой из них? В верхнем URLconf? Зачем? Где это документировано?
  • что поймает этот обработчик? Будет ли он поймать django.http.Http404, django.http.HttpResponseNotFound, django.http.HttpResponse (со status=404)?

Ответы

Ответ 1

Как мы обсуждали, ваша установка верна, но в settings.py вы должны сделать DEBUG=False. Это скорее производственная функция и не будет работать в среде разработки (если у вас нет DEBUG=False в dev-машине, конечно).

Ответ 2

Отладка должна быть ложной и добавлена для просмотра *args и **kwargs. Добавить к urls.py handler404 = 'view_404'

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

Если я не добавлю сервер args и kwargs, получите 500.

Ответ 3

Чтобы отобразить 404 сообщений об ошибках на пользовательской странице, выполните следующие действия:

В каталоге вашего проекта откройте settings.py и измените DEBUG следующим образом:

    DEBUG = False

В том же каталоге создайте файл и назовите его views.py, вставьте следующий код:

   from django.shortcuts import render

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

Наконец, откройте файл urls.py, который находится в том же каталоге проекта, и добавьте следующий код:

   from django.contrib import admin
   from . import views

   handler404 = views.handler404

   urlpatterns = [
      path('admin/', admin.site.urls),
   ]