Django REST Framework教程:Responses
Responses
与基本的HttpResponse对象不同, TemplateResponse 对象保留view提供的上下文的详细信息以计算 response. Response的最终输出直到它在稍后的响应过程中被需要才会计算。
— Django 文档
REST framework 通过提供一个 Response 类来支持 HTTP content negotiation,该类允许你返回可以呈现为多种内容类型的内容,具体取决于客户端的请求。
Response 类的子类 Django的 SimpleTemplateResponse。Response 对象用Python基本数据类型初始化。 然后REST framework 使用标准的HTTP content negotiation 来确定如何呈现最终的相应内容。
你并不需要一定是用 Response 类,你可以从你的视图返回常规的 HttpResponse 或者 StreamingHttpResponse 对象。使用Response类只提供了一个可以呈现多种格式的更好的界面来返回 content-negotiated 的 Web API 响应。
除非由于某种原因你要对 REST framework 做大量的自定义,否则你应该始终对返回对象的views使用 APIView 类或者 @api_view 函数。这样做可以确保视图在返回之前能够执行 content negotiation 并且为响应选择适当的渲染器。
创建 responses
Response()
签名: Response(data, status=None, template_name=None, headers=None, content_type=None)
与常规的 HttpResponse 对象不同,你不能使用渲染内容来实例化一个 Response 对象,而是传递未渲染的数据,包含任何Python基本数据类型。
Response 类使用的渲染器无法自行处理像 Django model 实例这样的复杂数据类型,因此你需要在创建 Response 对象之前将数据序列化为基本数据类型。
你可以使用 REST framework的 Serializer 类来执行此类数据的序列化,或者使用你自定义的来序列化。
参数:
data: response的数列化数据.status: response的状态码。默认是200.template_name:HTMLRenderer选择要使用的模板名称。headers: A dictionary of HTTP headers to use in the response.content_type: response的内容类型。通常由渲染器自行设置,由content negotiation确定,但是在某些情况下,你需要明确指定内容类型。
属性
.data
Request 对象的未渲染内容。
.status_code
HTTP 响应的数字状态吗。
.content
response的呈现内容。 .render() 方法必须先调用才能访问 .content 。
.template_name
template_name 只有在使用 HTMLRenderer 或者其他自定义模板作为response的渲染器时才需要提供该属性。
.accepted_renderer
将用于呈现response的render实例。
自动通过 APIView 或者 @api_view 在view返回response之前设置。
.accepted_media_type
由 content negotiation 阶段选择的媒体类型。
自动通过 APIView 或者 @api_view 在view返回response之前设置。
.renderer_context
一个将传递给渲染器的.render()方法的附加上下文信息字典。
自动通过 APIView 或者 @api_view 在view返回response之前设置。
标准的HttpResponse 属性
Response 类扩展了 SimpleTemplateResponse,并且所有常用的属性和方法都是提供的。比如你可以使用标准的方法设置response的header信息:
response = Response()response['Cache-Control'] = 'no-cache'
.render()
Signature: .render()
和其他的 TemplateResponse 一样,调用该方法将response的序列化数据呈现为最终的response内容。 当 .render() 被调用时, response的内容将被设置成在 accepted_renderer实例上调用 .render(data, accepted_media_type, renderer_context) 方法返回的结果。
你通常并不需要自己调用 .render() ,因为它是由Django的标准响应周期来处理的。
文章评论 0