Ответы
Ответы
В отличие от базовых объектов 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
, и все обычные атрибуты и методы также доступны для ответа. Например, вы можете установить заголовки для ответа стандартным способом:
.render()
Сигнатура: .render()
.
Как и любой другой TemplateResponse
, этот метод вызывается для преобразования сериализованных данных ответа в конечное содержимое ответа. Когда вызывается .render()
, содержимое ответа будет установлено в результат вызова метода .render(data, accepted_media_type, renderer_context)
на экземпляре accepted_renderer
.
Обычно вам не нужно вызывать .render()
самостоятельно, так как это обрабатывается стандартным циклом ответа Django.
Last updated