Requests(请求)

如果你正在做基于REST的Web服务...你最好忽略request.POST。

— Malcom Tredinnick, Django developers group

REST framework的Request类扩展了标准的HttpRequest,添加对REST framework的灵活请求解析和请求身份验证的支持。


Request parsing(请求解析)

REST framework的请求对象提供灵活的请求解析,允许你以与通常处理表单数据相同的方式使用JSON数据或其他媒体类型处理请求。

.data

request.data 返回请求正文的解析内容。这与标准的 request.POSTrequest.FILES 属性类似,除了下面的:

  • 它包括所有解析的内容, 包括 文件或非文件 输入。
  • 它支持解析除POST之外的HTTP方法的内容,这意味着你可以访问PUTPATCH请求的内容。
  • 它支持REST framework灵活的请求解析,而不仅仅支持表单数据。 例如,你可以以与处理传入表单数据相同的方式处理传入的JSON数据。

更多详细信息请参阅parsers documentation.

.query_params

request.query_paramsrequest.GET的一个更准确的同义词。

为了让你的代码清晰明了, 我们建议使用 request.query_params 而不是Django标准的request.GET。这样做有助于保持代码库更加正确和明了——任何HTTP方法类型可能包括查询参数,而不仅仅是GET请求。

.parsers

APIView类或@api_view装饰器将根据view中设置的parser_classes集合或基于DEFAULT_PARSER_CLASSES设置,确保此属性自动设置为Parser实例列表。

你通常并不需要访问这个属性。


Note: 如果客户端发送格式错误的内容,则访问request.data可能会引发ParseError。默认情况下REST framework的 APIView类或@api_view装饰器将捕获错误并返回400 Bad Request响应。

如果客户端发送具有无法解析的呃逆荣类型的请求,则会引发 UnsupportedMediaType 异常, 默认情况下会捕获该异常并返回 415 Unsupported Media Type 响应。


Content negotiation(内容协商)

请求提供了一些属性允许你确定内容协商阶段的结果。这允许你实现具体的行为,例如为不同的媒体类型选择不用的序列化方案。

.accepted_renderer

由内容协商阶段选择的render实例。

.accepted_media_type

由内容协商阶段接受的媒体类型的字符串。


Authentication(认证)

REST framework 提供了灵活的,每次请求的验证,让你能够: * 对API的不同部分使用不同的身份验证策略。 * 支持使用多个身份验证策略。 * 提供与传入请求相关联的用户和令牌信息。

.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 装饰器将根据在view中设置的 authentication_classes 或基于DEFAULT_AUTHENTICATORS 设置,确保此属性自动设置为 Authentication 实例的列表。

你通常并不需要访问此属性。


Browser enhancements(浏览器增强)

REST framework 支持一些浏览器增强功能,例如基于浏览器的 PUT, PATCHDELETE 表单。

.method

request.method 返回请求的HTTP方法的 大写 字符串表示形式。

透明地支持基于浏览器的 PUT, PATCHDELETE 表单。

更多详细信息请查阅 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 返回一个表示请求主体内容的流。

你通常不需要直接访问请求的内容类型,因为你通常将依赖于REST framework的默认请求解析行为。


Standard HttpRequest attributes(标准HttpRequest属性)

由于 REST framework 的 Request 扩展了 Django的 HttpRequest, 所以所有其他标准属性和方法也是可用的。例如 request.METArequest.session 字典正常可用。

请注意,由于实现原因, Request 类并不会从 HttpRequest 类继承, 而是使用合成扩展类。