Django drf Requests(请求)
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.POST 和 request.FILES 属性类似,除了下面的:
- 它包括所有解析的内容, 包括 文件或非文件 输入。
- 它支持解析除POST之外的HTTP方法的内容,这意味着你可以访问PUT和PATCH请求的内容。
- 它支持REST framework灵活的请求解析,而不仅仅支持表单数据。 例如,你可以以与处理传入表单数据相同的方式处理传入的JSON数据。
更多详细信息请参阅parsers documentation.
.query_params
request.query_params是request.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的一个实例。
.auth
request.auth 返回任何其他身份验证上下文。 request.auth 的确切行为取决于所使用的的认证策略,但它通常可以是请求被认证的token的实例。
如果请求未认证或者没有其他上下文,则 request.auth 的默认值为 None.
.authenticators
APIView 类或 @api_view 装饰器将根据在view中设置的 authentication_classes 或基于DEFAULT_AUTHENTICATORS 设置,确保此属性自动设置为 Authentication 实例的列表。
你通常并不需要访问此属性。
Browser enhancements(浏览器增强)
REST framework 支持一些浏览器增强功能,例如基于浏览器的 PUT, PATCH 和 DELETE 表单。
.method
request.method 返回请求的HTTP方法的 大写 字符串表示形式。
透明地支持基于浏览器的 PUT, PATCH 和 DELETE 表单。
.content_type
request.content_type 返回表示HTTP请求正文的媒体类型的字符串对象,如果未提供媒体类型,则返回空字符串。
你通常不需要直接访问请求的内容类型,因为你通常将依赖于REST framework的默认请求解析行为。
如果你确实需要访问请求的内容类型,你应该使用 .content_type 属性,而不是使用 request.META.get('HTTP_CONTENT_TYPE'), 因为它为基于浏览器的非表单内容提供了透明的支持。
.stream
request.stream 返回一个表示请求主体内容的流。
你通常不需要直接访问请求的内容类型,因为你通常将依赖于REST framework的默认请求解析行为。
Standard HttpRequest attributes(标准HttpRequest属性)
由于 REST framework 的 Request 扩展了 Django的 HttpRequest, 所以所有其他标准属性和方法也是可用的。例如 request.META 和 request.session 字典正常可用。
请注意,由于实现原因, Request 类并不会从 HttpRequest 类继承, 而是使用合成扩展类。
更多建议: