.содержание¶
Отрисованное содержимое ответа. Метод .render()
должен быть вызван, прежде чем можно будет получить доступ к .content
.
В отличие от базовых объектов HttpResponse, объекты TemplateResponse сохраняют детали контекста, который был предоставлен представлением для вычисления ответа. Окончательный результат ответа не вычисляется до тех пор, пока он не понадобится, позже в процессе ответа.
‒ Django documentation
Фреймворк REST поддерживает согласование содержимого HTTP, предоставляя класс Response
, который позволяет возвращать содержимое, которое может быть преобразовано в несколько типов содержимого, в зависимости от запроса клиента.
Класс Response
является подклассом Django SimpleTemplateResponse
. Объекты Response
инициализируются данными, которые должны состоять из собственных примитивов Python. Затем фреймворк REST использует стандартное согласование содержимого HTTP для определения того, как он должен отобразить конечное содержимое ответа.
Нет необходимости использовать класс Response
, вы также можете возвращать обычные объекты HttpResponse
или StreamingHttpResponse
из ваших представлений, если это необходимо. Использование класса Response
просто обеспечивает более удобный интерфейс для возврата согласованных по содержанию ответов Web API, которые могут быть преобразованы в различные форматы.
Если вы по каким-то причинам не хотите сильно настраивать REST-фреймворк, вы всегда должны использовать APIView
класс или @api_view
функцию для представлений, которые возвращают Response
объекты. Это гарантирует, что представление сможет выполнить согласование содержимого и выбрать подходящий рендерер для ответа, прежде чем он будет возвращен из представления.
Подпись: Response(data, status=None, template_name=None, headers=None, content_type=None)
В отличие от обычных объектов HttpResponse
, вы не создаете объекты Response
с отрисованным содержимым. Вместо этого вы передаете нерендерированные данные, которые могут состоять из любых примитивов Python.
Рендереры, используемые классом Response
, не могут нативно обрабатывать сложные типы данных, такие как экземпляры моделей Django, поэтому перед созданием объекта Response
необходимо сериализовать данные в примитивные типы данных.
Вы можете использовать классы Serializer
фреймворка REST для выполнения этой сериализации данных или использовать свою собственную сериализацию.
Аргументы:
data
: Сериализованные данные для ответа.
status
: Код статуса для ответа. По умолчанию 200. См. также status codes.
template_name
: Имя шаблона, которое будет использоваться, если выбрано HTMLRenderer
.
headers
: Словарь HTTP-заголовков для использования в ответе.
content_type
: Тип содержимого ответа. Как правило, он устанавливается автоматически рендерером по результатам согласования содержимого, но в некоторых случаях может потребоваться явное указание типа содержимого.
Неотредактированные, сериализованные данные ответа.
Цифровой код состояния ответа HTTP.
Отрисованное содержимое ответа. Метод .render()
должен быть вызван, прежде чем можно будет получить доступ к .content
.
template_name
, если задано. Требуется только если HTMLRenderer
или какой-либо другой пользовательский рендерер шаблона является принятым рендерером для ответа.
Экземпляр рендерера, который будет использоваться для рендеринга ответа.
Устанавливается автоматически с помощью APIView
или @api_view
непосредственно перед возвратом ответа из представления.
Тип носителя, который был выбран на этапе согласования содержимого.
Устанавливается автоматически с помощью APIView
или @api_view
непосредственно перед возвратом ответа из представления.
Словарь дополнительной контекстной информации, которая будет передана методу рендеринга .render()
.
Устанавливается автоматически с помощью APIView
или @api_view
непосредственно перед возвратом ответа из представления.
Класс Response
расширяет SimpleTemplateResponse
, и все обычные атрибуты и методы также доступны для ответа. Например, вы можете установить заголовки для ответа стандартным способом:
response = Response()
response['Cache-Control'] = 'no-cache'
Подпись: .render()
Как и любой другой TemplateResponse
, этот метод вызывается для преобразования сериализованных данных ответа в конечное содержимое ответа. Когда вызывается .render()
, содержимое ответа будет установлено в результат вызова метода .render(data, accepted_media_type, renderer_context)
на экземпляре accepted_renderer
.
Обычно вам не нужно вызывать .render()
самостоятельно, так как это обрабатывается стандартным циклом ответа Django.