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, 这表示你可以处理PUT及PATCH请求。 -
它为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 PATCH 和 DELETE表单。
.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.META 和request.session 。
需要注意的是由于Request类并非继承自 HttpRequest 类,但是在其基础上进行了扩展。