request.py

请求

如果你正在做基于 REST 的网络服务,你应该忽略 request.POST。

— 马尔科姆·特雷迪尼克,Django 开发者组

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


请求解析

REST 框架的 Request 对象提供了灵活的请求解析,它允许你以通常处理表单数据的方式处理具有 JSON 数据或其他媒体类型的请求。

.data

request.data 返回请求正文的已解析内容。这类似于标准 request.POSTrequest.FILES 属性,但

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

有关更多详细信息,请参阅 解析器文档

.query_params

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

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

.parsers

APIView 类或 @api_view 装饰器将确保此属性自动设置为 Parser 实例的列表,该列表基于视图上设置的 parser_classes 或基于 DEFAULT_PARSER_CLASSES 设置。

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


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

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


内容协商

该请求公开了一些属性,允许您确定内容协商阶段的结果。这允许您实现诸如为不同的媒体类型选择不同的序列化方案之类的行为。

.accepted_renderer

由内容协商阶段选择的渲染器实例。

.accepted_media_type

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


身份验证

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 实例的列表,该列表基于视图上设置的 authentication_classes 或基于 DEFAULT_AUTHENTICATORS 设置。

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


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


浏览器增强功能

REST 框架支持一些浏览器增强功能,例如基于浏览器的 PUTPATCHDELETE 表单。

.method

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

透明支持基于浏览器的 PUTPATCHDELETE 表单。

有关更多信息,请参阅 浏览器增强功能文档

.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 类继承,而是使用组合扩展该类。