Обработчик handler400
Обработчик handler400 позволяет переопределить стандартную страницу ошибки 400 Bad Request в Django. Он представляет собой функцию-обработчик, которая принимает объект запроса и исключение, а возвращает объект ответа. Настройка обработчика выполняется в файле urls.py проекта. Обработчик полезен для создания пользовательских страниц ошибок, логирования некорректных запросов и возврата структурированных JSON-ответов для API.
Синтаксис
# В корневом urls.py проекта
handler400 = 'myapp.views.custom_bad_request'
# Сама функция-обработчик
def custom_bad_request(request, exception):
# Логика обработки ошибки
return HttpResponse("Custom 400 page", status=400)
Пример
Настроим простой кастомный обработчик для ошибки 400:
# myapp/views.py
from django.http import HttpResponse
def custom_bad_request(request, exception):
return HttpResponse(
"<h1>Bad Request</h1><p>Please check your request data.</p>",
status=400
)
# myproject/urls.py
from django.urls import path
from myapp.views import custom_bad_request
handler400 = 'myapp.views.custom_bad_request'
urlpatterns = [
# Ваши URL-паттерны
]
Пример
Создадим обработчик, который возвращает JSON-ответ для API и логирует ошибку:
# myapp/views.py
import json
import logging
from django.http import JsonResponse
logger = logging.getLogger(__name__)
def custom_bad_request(request, exception):
logger.warning(f"Bad request: {exception}")
response_data = {
"error": "Bad Request",
"status": 400,
"message": str(exception)
}
return JsonResponse(response_data, status=400)
Результат при возникновении ошибки 400:
{"error": "Bad Request", "status": 400, "message": "Invalid data format"}
Пример
Используем шаблон для отображения пользовательской страницы ошибки:
# myapp/views.py
from django.shortcuts import render
def custom_bad_request(request, exception):
return render(
request,
"400.html",
{"error_message": str(exception)},
status=400
)
<!DOCTYPE html>
<html>
<head>
<title>Bad Request</title>
</head>
<body>
<h1>Oops! Bad Request</h1>
<p>{{ error_message }}</p>
<p>Please check your request and try again.</p>
</body>
</html>
Пример
Создадим обработчик с проверкой на конкретные типы исключений:
# myapp/views.py
from django.http import HttpResponse
from django.core.exceptions import SuspiciousOperation
def custom_bad_request(request, exception):
if isinstance(exception, SuspiciousOperation):
error_type = "Security violation detected"
else:
error_type = "General bad request"
return HttpResponse(
f"<h1>400 Bad Request</h1><p>{error_type}: {exception}</p>",
status=400
)
Смотрите также
-
обработчик
handler404,
который обрабатывает ошибки "Not Found" -
обработчик
handler500,
который обрабатывает внутренние ошибки сервера -
обработчик
handler403,
который обрабатывает ошибки доступа "Forbidden" -
класс
HttpResponseBadRequest,
который возвращает ответ со статусом 400