Обработчик handler404
Обработчик handler404 применяется для кастомизации страницы, которая показывается пользователю при возникновении ошибки "Страница не найдена" (HTTP 404). По умолчанию Django показывает стандартную HTML-страницу с ошибкой, но вы можете переопределить это поведение, указав собственное представление (view). Обработчик настраивается в корневом файле urls.py проекта и должен принимать два аргумента: объект request и исключение exception.
Настройка обработчика
Для переопределения обработчика ошибки 404, необходимо присвоить переменной handler404 путь к вашему представлению в корневом файле URLconf. Представление должно возвращать объект HttpResponseNotFound или HttpResponse со статусом 404.
# 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')),
]
В представлении вы можете полностью контролировать, какой контент будет показан пользователю при возникновении ошибки.
# 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)
Результат выполнения кода при обращении к несуществующей странице:
"Отображается кастомная страница 404"
Пример . С отладкой
Важно учитывать, что в режиме отладки (при DEBUG = True) Django использует встроенную страницу ошибки с подробной отладочной информацией. Чтобы увидеть вашу кастомную страницу, необходимо установить DEBUG = False в настройках проекта.
# myproject/settings.py
DEBUG = False
ALLOWED_HOSTS = ['example.com']
Также можно передавать в шаблон дополнительную информацию, например, путь запроса:
# 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-шаблон в проекте не совпадает с запрошенным путем. Это включает случаи, когда запрошенный путь содержит специальные символы или недопустимые значения для конвертеров.
# 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 не сможет преобразовать значение.
"Страница не найдена (404)"
Смотрите также
-
обработчик
handler500,
который переопределяет страницу ошибки сервера -
обработчик
handler403,
который переопределяет страницу ошибки доступа -
обработчик
handler400,
который переопределяет страницу ошибки запроса -
функция
get_object_or_404,
которая возвращает объект или вызывает ошибку 404