Ответы

Ответы

В отличие от базовых объектов HttpResponse, объекты TemplateResponse сохраняют детали контекста, который был предоставлен представлением для вычисления ответа. Окончательный результат ответа не вычисляется до тех пор, пока он не понадобится, позже в процессе ответа.

DRF поддерживает согласование содержимого HTTP, предоставляя класс Response, который позволяет возвращать содержимое, которое может быть преобразовано в несколько типов содержимого, в зависимости от запроса клиента.

Класс Response является подклассом Django SimpleTemplateResponse. Объекты Response инициализируются данными, которые должны состоять из собственных примитивов Python. Затем DRF использует стандартное согласование содержимого HTTP для определения того, как он должен отображать конечное содержимое ответа.

Нет необходимости использовать класс Response, при необходимости вы можете возвращать обычные объекты HttpResponse или StreamingHttpResponse из ваших представлений. Использование класса Response просто предоставляет более удобный интерфейс для возврата ответов Web API, согласованных по содержанию, которые могут быть преобразованы в различные форматы.

Если вы по каким-то причинам не хотите сильно кастомизировать DRF, вы всегда должны использовать класс APIView или функцию @api_view для представлений, которые возвращают объекты Response. Это гарантирует, что представление сможет выполнить согласование содержимого и выбрать подходящий рендерер для ответа, прежде чем он будет возвращен из представления.


Создание ответов

Response()

Сигнатура: Response(data, status=None, template_name=None, headers=None, content_type=None).

В отличие от обычных объектов HttpResponse, вы не создаете объекты Response со сформированным содержимым. Вместо этого вы передаете несформированные данные, которые могут состоять из любых примитивов Python.

Рендереры, используемые классом Response, не могут нативно обрабатывать сложные типы данных, такие как экземпляры моделей Django, поэтому вам необходимо сериализовать данные в примитивные типы данных перед созданием объекта Response.

Вы можете использовать классы DRF Serializer для выполнения этой сериализации данных или использовать свою собственную сериализацию.

Аргументы:

  • data: Сериализованные данные для ответа.

  • status: Код статуса для ответа. По умолчанию 200. См. также коды статуса.

  • template_name: Имя шаблона, который будет использоваться, если выбран HTMLRenderer.

  • headers: Словарь заголовков HTTP для использования в ответе.

  • content_type: Тип содержимого ответа. Как правило, он устанавливается автоматически рендерером в результате согласования содержимого, но в некоторых случаях может потребоваться явное указание типа содержимого.


Атрибуты

.data

Несформированные, сериализованные данные ответа.

.status_code

Цифровой код состояния ответа HTTP.

.content

Сформированное содержимое ответа. Метод .render() должен быть вызван, прежде чем можно будет получить доступ к .content.

.template_name

Файл шаблона template_name, если он задан. Требуется, только если HTMLRenderer или другой пользовательский рендерер шаблона является применимым рендерером для ответа.

.accepted_renderer

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

Устанавливается автоматически APIView или @api_view непосредственно перед возвратом ответа из представления.

.accepted_media_type

Тип документа, который был выбран на этапе согласования контента.

Устанавливается автоматически APIView или @api_view непосредственно перед возвратом ответа из представления.

.renderer_context

Словарь дополнительной контекстной информации, которая будет передана в метод .render() рендерера.

Устанавливается автоматически APIView или @api_view непосредственно перед возвратом ответа из представления.


Стандартные атрибуты HttpResponse

Класс Response расширяет SimpleTemplateResponse, и все обычные атрибуты и методы также доступны для ответа. Например, вы можете установить заголовки для ответа стандартным способом:

response = Response()
response['Cache-Control'] = 'no-cache'

.render()

Сигнатура: .render().

Как и любой другой TemplateResponse, этот метод вызывается для преобразования сериализованных данных ответа в конечное содержимое ответа. Когда вызывается .render(), содержимое ответа будет установлено в результат вызова метода .render(data, accepted_media_type, renderer_context) на экземпляре accepted_renderer.

Обычно вам не нужно вызывать .render() самостоятельно, так как это обрабатывается стандартным циклом ответа Django.

Last updated