响应
与基本 HttpResponse 对象不同,TemplateResponse 对象保留了视图提供的用于计算响应的上下文详情。响应的最终输出不会计算,直到需要时,在响应过程中稍后计算。
REST 框架通过提供一个 Response
类来支持 HTTP 内容协商,该类允许你返回可呈现为多种内容类型的内容,具体取决于客户端请求。
Response
类是 Django 的 SimpleTemplateResponse
的子类。Response
对象使用数据进行初始化,该数据应由本机 Python 原语组成。然后,REST 框架使用标准 HTTP 内容协商来确定它应如何呈现最终的响应内容。
你无需使用 Response
类,你还可以从视图中返回常规的 HttpResponse
或 StreamingHttpResponse
对象(如果需要)。使用 Response
类只是为返回内容协商的 Web API 响应提供了一个更好的界面,该响应可以呈现为多种格式。
除非你出于某种原因要对 REST 框架进行大量自定义,否则你应始终对返回 Response
对象的视图使用 APIView
类或 @api_view
函数。这样做可确保视图在从视图返回之前执行内容协商并选择响应的适当呈现器。
创建响应
Response()
签名: Response(data, status=None, template_name=None, headers=None, content_type=None)
与常规 HttpResponse
对象不同,你不会使用呈现的内容实例化 Response
对象。相反,你传入未呈现的数据,该数据可能由任何 Python 原语组成。
Response
类使用的呈现器不能本机处理复杂数据类型(如 Django 模型实例),因此你需要在创建 Response
对象之前将数据序列化为原始数据类型。
你可以使用 REST 框架的 Serializer
类来执行此数据序列化,或使用你自己的自定义序列化。
参数
data
:响应的序列化数据。status
:响应的状态代码。默认为 200。另请参阅状态代码。template_name
:如果选择了HTMLRenderer
,则要使用的模板名称。headers
:响应中要使用的 HTTP 标头字典。content_type
:响应的内容类型。通常,这将由渲染器根据内容协商自动设置,但在某些情况下,您可能需要显式指定内容类型。
属性
.data
响应的未呈现序列化数据。
.status_code
HTTP 响应的数字状态代码。
.content
响应的呈现内容。必须在访问 .content
之前调用 .render()
方法。
.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()
时,响应内容将设置为在 accepted_renderer
实例上调用 .render(data, accepted_media_type, renderer_context)
方法的结果。
通常不需要自己调用 .render()
,因为 Django 的标准响应周期会处理它。