Обработчик handler404

Обработчик handler404 применяется для кастомизации страницы, которая показывается пользователю при возникновении ошибки "Страница не найдена" (HTTP 404). По умолчанию Django показывает стандартную HTML-страницу с ошибкой, но вы можете переопределить это поведение, указав собственное представление (view). Обработчик настраивается в корневом файле urls.py проекта и должен принимать два аргумента: объект request и исключение exception.

Настройка обработчика

Для переопределения обработчика ошибки 404, необходимо присвоить переменной handler404 путь к вашему представлению в корневом файле URLconf. Представление должно возвращать объект HttpResponseNotFound или HttpResponse со статусом 404.

python# myproject/urls.py

from django.contrib import admin
from django.urls import path, include
from myapp.views import custom_404_view

handler404 = 'myapp.views.custom_404_view'

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

В представлении вы можете полностью контролировать, какой контент будет показан пользователю при возникновении ошибки.

python# myapp/views.py

from django.shortcuts import render
from django.http import HttpResponseNotFound

def custom_404_view(request, exception):
  return render(request, '404.html', status=404)

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

python"Отображается кастомная страница 404"

Пример . С отладкой

Важно учитывать, что в режиме отладки (при DEBUG = True) Django использует встроенную страницу ошибки с подробной отладочной информацией. Чтобы увидеть вашу кастомную страницу, необходимо установить DEBUG = False в настройках проекта.

python# myproject/settings.py

DEBUG = False

ALLOWED_HOSTS = ['example.com']

Также можно передавать в шаблон дополнительную информацию, например, путь запроса:

python# myapp/views.py

from django.shortcuts import render

def custom_404_view(request, exception):
  context = {
    'request_path': request.path,
    'user': request.user,
  }
  return render(request, '404.html', context, status=404)

Использование с конвертерами

Обработчик handler404 автоматически вызывается, когда ни один URL-шаблон в проекте не совпадает с запрошенным путем. Это включает случаи, когда запрошенный путь содержит специальные символы или недопустимые значения для конвертеров.

python# myapp/urls.py

from django.urls import path
from myapp.views import article_detail

urlpatterns = [
  path('articles/<int:pk>/', article_detail, name='article_detail'),
]

При обращении к странице '/articles/abc/', где вместо числа передана строка, сработает обработчик handler404, так как конвертер int не сможет преобразовать значение.

python"Страница не найдена (404)"

Смотрите также

  • обработчик handler500,
    который переопределяет страницу ошибки сервера
  • обработчик handler403,
    который переопределяет страницу ошибки доступа
  • обработчик handler400,
    который переопределяет страницу ошибки запроса
  • функция get_object_or_404,
    которая возвращает объект или вызывает ошибку 404