request.py

如果你在做基于 REST 的 Web 服务相关工作……你应该忽略 request.POST。

— Malcom Tredinnick,Django 开发者组

REST 框架的 Request 类扩展了标准的 HttpRequest,增加了对 REST 框架灵活请求解析和请求认证的支持。

请求解析

REST 框架的 Request 对象提供了灵活的请求解析功能,允许你以处理表单数据相同的方式处理包含 JSON 数据或其他媒体类型的请求。

.data

request.data 返回请求体的解析内容。这类似于标准的 request.POSTrequest.FILES 属性,但有以下区别:

  • 它包含所有解析后的内容,包括文件和非文件输入。
  • 它支持解析 HTTP 方法(不仅仅是 POST 方法)的内容,这意味着你可以访问 PUT 和 PATCH 请求的内容。
  • 它支持 REST 框架灵活的请求解析,而不仅仅是支持表单数据。例如,你可以类似处理传入表单数据那样处理传入的 JSON 数据。

更多详情请参见解析器文档。

.query_params

request.query_paramsrequest.GET 的一个命名更合理的同义词。

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

.parsers

APIView 类或 @api_view 装饰器将确保此属性自动设置为一个解析器实例列表,这些解析器基于视图上设置的 parser_classesDEFAULT_PARSER_CLASSES 设置。

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

注意 :如果客户端发送的内容有误,那么访问 request.data 可能会引发 ParseError。默认情况下,REST 框架的 APIView 类或 @api_view 装饰器将捕获该错误并返回 400 Bad Request 响应。

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

内容协商

请求暴露了一些属性,允许你确定内容协商阶段的结果。这使你能够实现诸如为不同的媒体类型选择不同的序列化方案等行为。

.accepted_renderer

被内容协商阶段选中的渲染器实例。

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

认证

REST 框架提供了灵活的按请求认证的功能,使你能够:

  • 为 API 的不同部分使用不同的认证策略。
  • 支持使用多种认证策略。
  • 提供与传入请求相关的用户和令牌信息。

.user

request.user 通常返回 django.contrib.auth.models.User 的一个实例,尽管具体行为取决于所使用的认证策略。

如果请求未经过认证,则 request.user 的默认值是 django.contrib.auth.models.AnonymousUser 的一个实例。

更多详情请参见认证文档。

.auth

request.auth 返回任何额外的认证上下文。request.auth 的确切行为取决于所使用的认证策略,但它通常可能是用于认证请求的令牌实例。

如果请求未经过认证,或者没有额外的上下文,request.auth 的默认值是 None。

更多详情请参见认证文档。

.authenticators

APIView 类或 @api_view 装饰器将确保此属性自动设置为一个认证实例列表,这些认证基于视图上设置的 authentication_classesDEFAULT_AUTHENTICATORS 设置。

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

注意 :在调用 .user.auth 属性时,可能会看到引发 WrappedAttributeError。这些错误源自认证器的标准 AttributeError,但为了防止它们被外部属性访问所抑制,必须将它们重新引发为不同类型的异常。Python 不会识别出该 AttributeError 源自认证器,而是会假定请求对象没有 .user.auth 属性。需要修复认证器。

浏览器增强功能

REST 框架支持一些浏览器增强功能,例如基于浏览器的 PUT、PATCH 和 DELETE 表单。

.method

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

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

更多详情请参见浏览器增强功能文档。

.content_type

request.content_type 返回一个字符串对象,表示 HTTP 请求体的媒体类型,或者如果没有提供媒体类型则返回空字符串。

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

如果你确实需要访问请求的内容类型,你应该使用 .content_type 属性,而不是使用 request.META.get('HTTP_CONTENT_TYPE'),因为它为基于浏览器的非表单内容提供了透明的支持。

更多详情请参见浏览器增强功能文档。

.stream

request.stream 返回一个表示请求体内容的流。

通常你不需要直接访问请求的内容,因为你通常会依赖 REST 框架的默认请求解析行为。

标准的 HttpRequest 属性

由于 REST 框架的 Request 扩展了 Django 的 HttpRequest,因此所有其他标准属性和方法也都是可用的。例如,request.METArequest.session 字典像往常一样可用。

由于实现原因,Request 类并没有继承自 HttpRequest 类,而是通过组合来扩展该类。


观复
16 声望1 粉丝

君子慎独,不欺暗室,卑以自牧,含章可贞