6 Django REST Framework 开发 ---- Request 与 Response

DRF 的 Request

DRF 的 Request 类扩展了标准 HttpRequest 类,它的引入使 DRF 可以更灵活地处理 "request parsing" 和 "request authentication"。

Request Parsing (解析请求)
.data: request.data 返回请求 body 的内容。这个操作与标准 Django 的 request.POST, request.FILES 属性十分相像,区别在于:

  • 该方法包括所有解析内容(parsed content), 既包括文件又包括非文件 Inputs
  • 它支持所有 HTTP 解析请求,如: POST,PUT,PATCH 请求
  • 支持 DRF 灵活的解析请求(request parsing),不是只支持表单数据。比如,你可以用此方法直接处理 JSON 数据

.query_params: 被形象地说成是 request.GET 的同义词。在编代码时,DRF 推荐使用 request.query_params 而不是 Django 标准的 request.GET。这样做的目的是为了增加你代码的可读性,因为 http 方法不仅仅只时 GET,因此使用 query_params 很好的泛化这一块代码。

.parsers:在 APIView 类或 @api_view 装饰器确保了这个 parser 属性会生成多个 Parser 实例,以确保 parsers 可以处理各种类型的数据输入。

Authentication:
DRF 提供灵活地 per-request 认证,以确保:

  • 可以对不同的 API 部分,使用不同的认证策略(policy)
  • 提供 multiple authentication policies 的支持
  • 提供用户和口令关联支持

.user: 取决于认证策略,一般返回一个 django.contrib.auth.models.User 的实例。对于非授权用户则返回 django.contrib.auth.models.AnonymousUser 实例
.auth: 返回认证内容。具体返回什么取决于授权策略,且对于非授权用户或者不提供无附加内容的请求会返回初始值 None

DRF 的 Response

DRF 提供 Response 类来支持 HTTP content negotiation, 用这个类用户可以根据用户请求将返回内容渲染成不同的类型。
Response 类是 Django 的 SimpleTemplateResponse 的子类。Response 对象使用 python 原生 primitives 数据结构进行初始化。 然后 DRF 使用标准 HTTP content negotiattion 决定如何渲染 Response 内容。
DRF 团队推荐除非特别需要,否则应该首选 APIView 或者 @api_view 函数来返回 Response 对象。这样做可以确保 view 经过 content negotiation 后才选择返回了适当的经过渲染的 Response,从而避免从 view 直接返回。

与 HattpResponse 不同,你不能直接初始化渲染过的 Response 对象, 而是通过使用 python 原生的数据类型 -> 未经渲染的数据。因为 Response 类不能处理复合数据类型如 Django Model 实例,因此想实例化 Response 之前需要先序列化数据。序列化时你既可以使用 DRF 提供的 Serializer 也可以使用自己定义的 Serializer。

Response(data, status=None, template_name=None, headers=None, content_type=None)

data:序列化后的数据,用于返回 Response
status:返回状态码 见: HTTP Status Code
template_name: 如果使用 HTMLRenderer,则应该选一个template name
headers:用于返回用户 Response 的 HTTP header 的字典
content_type: response 的内容类型。通常会由 content negotiation 自动选择,但特殊情况下,有可能需要特殊声明。

猜你喜欢

转载自www.cnblogs.com/crazy-chinese/p/9828147.html