Атрибут body

Атрибут body класса HttpRequest возвращает тело запроса в виде байтовой строки (bytes). Он предназначен для доступа к сырым данным, переданным в запросе, например, при обработке JSON-данных, загрузке файлов или работе с веб-хуками. В отличие от атрибутов HttpRequest/attribute/GET/">GET и HttpRequest/attribute/POST/">POST, которые предоставляют обработанные данные форм, body позволяет получить исходные данные без какой-либо интерпретации.

Атрибут доступен только для чтения. Он может быть пустым (b''), если тело запроса отсутствует. Для обработки данных из body часто требуется дополнительное декодирование, например, в формат UTF-8 при работе с текстовыми данными.

Синтаксис

pythonrequest.body

Пример

Рассмотрим базовый пример получения сырых данных из тела запроса в представлении:

pythonfrom django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def raw_data_view(request):
  raw_body = request.body
  return HttpResponse(f"Raw body: {raw_body}")

Пример

Часто бывает необходимо декодировать байтовые данные в строку для дальнейшей обработки. Например, при получении JSON:

pythonimport json
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def json_view(request):
  try:
    data = json.loads(request.body.decode('utf-8'))
    return JsonResponse({'status': 'ok', 'data': data})
  except json.JSONDecodeError:
    return JsonResponse({'status': 'error'}, status=400)

Результат выполнения при корректном JSON-запросе:

python{"status": "ok", "data": {"key": "value"}}

Пример

Атрибут body также полезен при работе с веб-хуками, когда данные приходят в формате XML или других нестандартных форматах:

pythonfrom django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
def webhook_view(request):
  xml_data = request.body
  # Здесь можно парсить XML
  return HttpResponse(f"Received XML: {xml_data[:100]}...")

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

python"Received XML: b'<?xml version=\"1.0\" ...'..."

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

  • атрибут GET,
    который предоставляет доступ к данным GET-запроса
  • атрибут POST,
    который предоставляет доступ к данным POST-запроса
  • атрибут FILES,
    который содержит загруженные файлы в запросе
  • класс HttpRequest,
    основной класс для работы с запросами в Django