Как в Django вернуть ошибку 400 Bad Request при получении некорректных данных?

«Как в Django вернуть ошибку 400 Bad Request при получении некорректных данных?» — вопрос из категории Django, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для возврата ответа с HTTP-статусом 400 Bad Request в Django, что является стандартом для ошибок на стороне клиента (например, невалидные данные), используется класс JsonResponse.

Это предпочтительный способ для REST API, так как позволяет вернуть структурированное сообщение об ошибке в формате JSON.

1. Использование JsonResponse (рекомендуется для API)

Вы можете передать словарь с описанием ошибки и указать status=400.

from django.http import JsonResponse

def my_api_view(request):
    # Пример: проверяем наличие обязательного параметра 'email'
    email = request.POST.get('email')

    if not email:
        # Возвращаем JSON с ошибкой и статусом 400
        return JsonResponse(
            {'error': 'Параметр "email" является обязательным.'},
            status=400
        )

    # ... дальнейшая логика обработки корректных данных
    return JsonResponse({'status': 'ok'})

2. Использование валидации Django Forms

При работе с формами Django предоставляет встроенный механизм валидации. Если форма невалидна, её ошибки можно легко сериализовать в JSON.

from django.http import JsonResponse
from .forms import MyForm

def process_form_view(request):
    form = MyForm(request.POST)

    if form.is_valid():
        # Обработка данных
        return JsonResponse({'success': True})
    else:
        # form.errors содержит словарь с ошибками валидации
        return JsonResponse(form.errors, status=400)

3. Использование HttpResponseBadRequest

Это более простой вариант, который возвращает ответ с телом в виде простого текста. Подходит для случаев, когда не требуется JSON-ответ.

from django.http import HttpResponseBadRequest

def simple_view(request):
    if not request.POST.get('data'):
        return HttpResponseBadRequest("Ошибка: данные не предоставлены.")

    # ...