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之前设置。

.accepted_media_type

有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的标准响应循环处理的。

0条评论

相关推荐

django教程

r

Django 2019-05-20 10:53:53

Celery

celery学习资料

Django 2019-05-25 18:41:55

django教程入门

适合django新人使用的学习手册

Django 2019-07-01 14:28:04

django实用资料

django项目从0到1自己总结的实用的资料,大部分常用的功能这里都有

Django 2019-05-08 18:21:34