BadRequest

Исключение BadRequest относится к модулю django.core.exceptions и вызывается в тех случаях, когда сервер не может обработать входящий запрос из-за его некорректности. Это может происходить при неверном формате данных, отсутствии обязательных параметров или при передаче данных, которые не соответствуют ожидаемой структуре. Данное исключение автоматически преобразуется в HTTP-ответ со статусом 400 (Bad Request), что позволяет информировать клиента о проблеме с его запросом.

Исключение принимает один обязательный аргумент - строку с описанием ошибки, которая будет передана клиенту в качестве сообщения. Также можно передать дополнительные параметры для более детальной диагностики проблемы.

Синтаксис

pythonfrom django.core.exceptions import BadRequest

raise BadRequest(message, *args, **kwargs)

Пример . Использование в представлении

Рассмотрим пример представления, которое обрабатывает данные формы. Если обязательные поля отсутствуют, вызывается исключение BadRequest:

pythonfrom django.core.exceptions import BadRequest
from django.http import JsonResponse

def process_data(request):
  if request.method != 'POST':
    raise BadRequest("Method not allowed")
  
  data = request.POST
  if not data.get('username'):
    raise BadRequest("Username field is required")
  
  if not data.get('email'):
    raise BadRequest("Email field is required")
  
  return JsonResponse({"status": "success"})

Результат выполнения кода при отсутствии поля 'username':

python"Bad Request: Username field is required"

Обработка JSON-запросов

При работе с JSON-запросами также важно проверять корректность переданных данных. Исключение BadRequest помогает централизованно обрабатывать ошибки валидации:

pythonimport json
from django.core.exceptions import BadRequest
from django.http import JsonResponse

def process_json(request):
  if request.method != 'POST':
    raise BadRequest("Method not allowed")
  
  try:
    data = json.loads(request.body)
  except json.JSONDecodeError:
    raise BadRequest("Invalid JSON format")
  
  if 'user_id' not in data:
    raise BadRequest("Missing user_id parameter")
  
  if not isinstance(data['user_id'], int):
    raise BadRequest("user_id must be an integer")
  
  return JsonResponse({"user": data['user_id']})

Результат выполнения кода при передаче неверного JSON:

python"Bad Request: Invalid JSON format"

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

Исключение BadRequest можно эффективно использовать с декораторами для создания универсальной валидации запросов. Это позволяет избежать дублирования кода проверки в каждом представлении:

pythonfrom functools import wraps
from django.core.exceptions import BadRequest

def require_fields(fields):
  def decorator(view_func):
    @wraps(view_func)
    def wrapper(request, *args, **kwargs):
      if request.method != 'POST':
        raise BadRequest("Method not allowed")
      
      for field in fields:
        if field not in request.POST:
          raise BadRequest(f"Missing field: {field}")
      
      return view_func(request, *args, **kwargs)
    return wrapper
  return decorator

@require_fields(['title', 'content'])
def create_article(request):
  return JsonResponse({"status": "article created"})

Результат выполнения кода при отсутствии поля 'content':

python"Bad Request: Missing field: content"

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

  • исключение Http404,
    которое возвращает статус 404 при отсутствии ресурса
  • исключение DoesNotExist,
    которое возникает при попытке доступа к несуществующему объекту
  • исключение IntegrityError,
    которое возникает при нарушении целостности базы данных
  • исключение ValidationError,
    которое используется для валидации данных форм