请求
如果你正在做基于 REST 的网络服务,你应该忽略 request.POST。
— 马尔科姆·特雷迪尼克,Django 开发者组
REST 框架的 Request
类扩展了标准 HttpRequest
,增加了对 REST 框架的灵活请求解析和请求身份验证的支持。
请求解析
REST 框架的 Request 对象提供了灵活的请求解析,它允许你以通常处理表单数据的方式处理具有 JSON 数据或其他媒体类型的请求。
.data
request.data
返回请求正文的已解析内容。这类似于标准 request.POST
和 request.FILES
属性,但
- 它包括所有已解析的内容,包括文件和非文件输入。
- 它支持解析
POST
以外的 HTTP 方法的内容,这意味着你可以访问PUT
和PATCH
请求的内容。 - 它支持 REST 框架的灵活请求解析,而不仅仅是支持表单数据。例如,你可以处理传入的 JSON 数据,类似于处理传入的 表单数据 的方式。
有关更多详细信息,请参阅 解析器文档。
.query_params
request.query_params
是 request.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 框架支持一些浏览器增强功能,例如基于浏览器的 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.META
和 request.session
字典可以正常使用。
请注意,由于实现原因,Request
类不会从 HttpRequest
类继承,而是使用组合扩展该类。