Django REST framework API: Requests

Posted by eckid on August 12, 2016

Requests

原文

如果你构建的是REST风格的应用,你最好忘掉request.POST。

— Malcom Tredinnick, Django developers group

REST framework的 Request 类是对原生 HttpRequest的扩展,来为REST framework提供灵活的请求解析和认证功能。


Request 解析

REST framework的Request 对象提供了灵活的请求解析机制,使你可以将请求做为JSON数据来处理,或者其它媒体类型。

.data

request.data 返回的是请求主体的解析内容。这和标准的 request.POST

request.FILES 属性类似,但是存在以下区别:

  • 它包含了所有被解析的内容, 包括file non-file 类型的输入。

  • 它支持解析HTTP 方法的内容,不局限于 POST, 这表示你可以处理 PUTPATCH 请求。

  • 它为REST framework’s 提供了灵活的请求解析机制,不局限于表单数据。例如,你可以像处理表单数据一样处理JSON数据。

更多内容参见 parsers documentation.

.query_params

request.query_params 是更准确命名的 request.GET的同义词(synonym)。

为了代码的可读性,我们建议使用 request.query_params 来替代 Django的request.GET。这样能使代码更加明确,因为任何HTTP方法都包含查询参数,不仅是GET请求。

.parsers

使用 APIView 类或者 @api_view 装饰器能够保证属性值能够自动被设置给一系列Parser 实例,它基于 view 中的 parser_classes 设置,或者DEFAULT_PARSER_CLASSES 中的设置。一般不需要自己处理该属性。


提示: 一旦客户端发送了形式有误的内容(malformed content),此时访问 request.data 将会引发一个ParseError。默认情况下REST framework的 APIView 类或者 or @api_view 装饰器将会捕捉到这个错误并返回一个400 Bad Request 响应。

加入请求包含了一个无法被解析的content-type ,那么将会引发UnsupportedMediaType异常,该异常默认返回 415 Unsupported Media Type响应。


内容协商

请求将会暴露一些属性,让你来确定内容协商的级别。它能协助你来完善行为,比如选择合适的序列化方式来应对不同的设备类型。

.accepted_renderer

由内容协商级别所选出的renderer实例。

.accepted_media_type

一个内容协商级别能够接受的媒体类型的字符串。


Authentication

REST framework提供了灵活的, 单次请求的认证机制,能让你:

  • 在API的不同部分使用不同的认证策略

  • 支持多种认证策略

  • 同时提供此次请求的user和token的信息

.user

request.user 通常会返回一个 django.contrib.auth.models.User的实例,尽管其行为会依赖于当前使用的认证策略。 如果此次请求是未经认证的,那么 request.user 的默认值将是一个django.contrib.auth.models.AnonymousUser的实例。

更多信息请参见 authentication documentation.

.auth

request.auth 返回一段额外的认证上下文, request.auth 的行为依赖于当前的认证策略,但是通常情况下将会是被认证的请求的token实例。

假如请求是未认证的,或者没有携带额外的上下文, request.auth 的默认值是None

更多信息可见 authentication documentation.

.authenticators

APIView@api_view 装饰器能够保证Authentication 实例能自动设置一系列属性,其基于view中的 authentication_classes 设置或是DEFAULT_AUTHENTICATORS 设置。通常不会用到这个属性。


浏览器增强

REST framework提供了基于不同浏览器的功能增强,比如 PUT PATCHDELETE表单。

.method

request.method 返回了该请求的HTTP方法的大写命名字符串。

基于浏览器的 PUT, PATCH DELETE 表单的透明支持。

更多信息参见 browser enhancements documentation.

.content_type

request.content_type返回一个字符串来指示此次HTTP 请求主体的媒体类型,如果未提供媒体类型则该参数为空。

通常情况下我们不需要直接获取请求的内容,使用REST framework提供的请求解析是更好的选择。

如果要获取请求的媒体类型,使用 .content_type 属性比使用 request.META.get('HTTP_CONTENT_TYPE')要更好,因为它提供了浏览器端无表单内容的透明支持。

更多信息参见browser enhancements documentation.

.stream

request.stream 返回了请求主体的流式(stream)呈现。

通常情况下我们不需要直接获取请求的内容,使用REST framework提供的请求解析是更好的选择。


标准HttpRequest属性

由于REST framework的Request 扩展自Django的 HttpRequest,它可以支持所有的原有属性和方法。比如 request.METArequest.session

需要注意的是由于Request类并非继承自 HttpRequest 类,但是在其基础上进行了扩展。