Requests
REST框架Request类扩展了标准的HttpRequest,添加了对REST框架灵活的请求解析和请求认证的支持。
Request parsing
REST框架Request对象提供灵活的请求解析,使你能够以处理寻常表单数据相同的方式去处理JSON数据或其他媒体类型的请求。
.data
request.data 返回 request.body 解析后的内容。这和标准的request.POST 和 request.FILES 属性相类似,除了以下几点:
- 它包含所有的解析内容,并扩文件和非文件的输入。
- 它支持解析HTTP除POST方式以外方法的内容,这意味着你可以获取PUT和PATCH请求的内容。
- 它支持REST框架灵活的请求解析,而不仅仅是支持表单数据。 例如,您可以以与处理传入表单数据相同的方式处理传入的JSON数据。
有关详细信息,请参阅解析器文档。
.query_params
request.query_params是request.GET更正确的命名同义词。
为了清楚你的代码,我们建议使用request.query_params而不是Django的标准request.GET。 这样做有助于保持你的代码更正确和明析 - 任何HTTP方法类型都可能包括查询参数,而不仅仅是GET请求。
.parsers
APIView类或@api_view装饰器将确保根据在视图上设置的parser_classes或基于DEFAULT_PARSER_CLASSES设置,将此属性自动设置为Parser实例列表。
通常你不需要访问此属性。
注意:如果客户端发送错误格式的内容,那么访问request.data可能会引发ParseError。默认的REST framework's APIView 类或者 @api_view 装饰器能够捕捉到这个错误并且返回一个状态码为400的响应。
如果客户端发送一个无法解析的内容的请求,则会引发UnsupportedMediaType异常,默认情况下将被捕获,并返回一个415不受支持的媒体类型响应。
Content negotiation
todo
Authentication
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_classes或DEFAULT_AUTHENTICATORS设置,将此属性自动设置为身份验证实例列表。
通常您不需要访问此属性。
Browser enhancements
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框架的默认请求解析行为。
Standard HttpRequest attributes
由于REST框架的请求扩展了Django的HttpRequest,所有其他标准属性和方法也可用。 例如,request.META和request.session字典可以正常使用。
请注意,由于执行原因,Request类不继承HttpRequest类,而是使用组合扩展类。