Обработчик handler400

Обработчик handler400 позволяет переопределить стандартную страницу ошибки 400 Bad Request в Django. Он представляет собой функцию-обработчик, которая принимает объект запроса и исключение, а возвращает объект ответа. Настройка обработчика выполняется в файле urls.py проекта. Обработчик полезен для создания пользовательских страниц ошибок, логирования некорректных запросов и возврата структурированных JSON-ответов для API.

Синтаксис

python# В корневом urls.py проекта
handler400 = 'myapp.views.custom_bad_request'

# Сама функция-обработчик
def custom_bad_request(request, exception):
  # Логика обработки ошибки
  return HttpResponse("Custom 400 page", status=400)

Пример

Настроим простой кастомный обработчик для ошибки 400:

python# 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
  )
python# 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 и логирует ошибку:

python# 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:

python{"error": "Bad Request", "status": 400, "message": "Invalid data format"}

Пример

Используем шаблон для отображения пользовательской страницы ошибки:

python# 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
  )
templates/400.html<!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>

Пример

Создадим обработчик с проверкой на конкретные типы исключений:

python# 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