Resposes
REST frame通过提过一个Response
类来支持HTTP content negotiation,该类允许返回可以呈现为多种内容类型的内容,具体取决于客户端的请求。
Response
类是Django中SimpleTemplateResponse
类中的一个子类。Response
对象用Python基本数据类型初始化。然后REST framework使用标准的HTTP content negotiation来确定如何呈现最终的相应。
你并不需要一定是用Response
类,你可以从你的视图返回常规的HttpResponse
或者StreamingHttpResponse
对象。使用Response
类只提供了一个可以呈现多种格式的更好的界面来返回content-negotiatied的Web API相应。
除非出于某种原因需要大量定制REST framework,否则应始终对返会Response对象的视图使用APIView
类或@api_view
装饰器。这样做可确保视图在视图返回之前能够执行content negotiation并且为响应选择适当的渲染器。
创建responses
Response()
语法:Response(data, status=None, template_name=None, headers=None, content_type=None)
与常规HttpResponse
对象不同,不会使用渲染的内容实例化Response
对象。相反,传递的是为渲染的数据,可能由任何Python基元组成。
由于Response
类使用的渲染器不能处理复杂的数据类型,例如Django模型实例,所以需要在创建Response
对象之前将数据序列化为基本数据类型。可以使用REST framework的Serializer
类来执行数据序列化,或者使用自定义序列化。
参数:
- data:响应的序列化数据。
- status:响应的状态码,默认为200。
- template_name:选择HTMLRenderer时使用的模板名称。
- headers:响应中使用的HTTP headers的字典。
- content-type:响应的内容类型。通常情况下,渲染器会根据content negotiation的结果自动设置,但有些情况下需要明确指定内容类型。
属性
.data
未渲染的、序列化的响应数据。
.status_code
HTTP响应数字状态码。
.content
响应的渲染内容。在访问.content
之前,必须先调用.render()
方法。
.template_name
template_name只有在使用HTMLRenderer
或者其他自定义模板作为response的渲染器时才需要提供该属性。
.accepted_renderer
将用于呈现response的render实例。
自动通过APIView
或者@api_view
在视图返回response之前设置。
有content negotiation阶段选择的媒体类型。
自动通过APIView
或者@api_view
在视图返回response之前设置。
.renderer_context
一个将渲染给渲染的.render()
方法的附加上下文信息字典。
自动通过APIView
或者@api_view
在视图返回response之前设置。
标准的HTTPResponse属性
Response
类扩展了SimpleTemplateResponse
,并且相应中也提供了所常用的属性和方法。例如,可以用标准方式在相应中设置headers:
response = Response()
response["Cache-Control"] = "no-cache"
.render()
与其他任何TemplateResponse
一样,调用此方法将响应的序列化数据渲染为最终响应内容。调用.render()
时,响应内容将设置为在accepted_renderer
实例上调用.render(data, accepted_metia_type, renderer_context)
方法的结果。
通过不需要自己调用.render()
,因为它是由Django的标准响应循环处理的。