请求(Requests)
Request源码地址:https://github.com/encode/django-rest-framework/blob/master/rest_framework/request.py
“如果你正在做基于rest的webservice,您应该忽略request.POST” -Maclcom Tredinnick,Django developers group
REST framework的Request类继承自标准的HttpRequest,在此基础上为Rest framework添加了灵活的请求解析和请求认证。
请求解析(Request parsing)
REST framework的Request对象提供了灵活的请求解析,它允许你像处理通常的表单数据一样处理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装饰器将会确保根据视图上设置的parser_classes或基于DEFAULT_PARSER_CLASSES,将此属性(request.parser)自动设置为Parser实例列表。
通常,您不需要访问此属性。
注意:如果客户端发送了错误的内容,访问request.data将会出现ParseError。默认情况下,REST framework的APIView类或@api_view将会捕获这个错误并返回404 Bad Request响应。
如果客户端发送的请求的content-type无法被解析,将会出现UnsupportedMediaType异常,默认情况下该异常会被捕获并返回415 Unsupported Media Type响应。
Content negotiation
request公开了一些属性,允许您决定内容解析的结果。这允许您实现一些操作,比如为不同的media type选择不同的序列化方案。
.accepted_renderer
内容解析阶段选择的渲染器的类型。
.accepted_media_type
描述内容解析阶段被接受的media type的字符串。
Authentication
REST framework提供了灵活的、单请求的认证,提供了以下能力:
- 在API的不同部分可以使用不同的认证策略;
- 支持多个认证策略;
- 提供与传入的请求相关的用户和token信息。
.user
request.user通常返回django.contrib.auth.models.User的一个实例,尽管它依赖于正在使用的认证策略。
如果请求没有被认证,request.user的默认值是django.contrib.auth.models.AnonymousUser的一个实例。
更多信息请查看authentication documentation
.authenticators
APIView类或@api_view装饰器将会确保根据试视图上设置的parser_classes或基于DEFAULT_PARSER_CLASSES设置,将此属性(request.parser)自动设置为Parser实例列表。
通常,您不需要访问此属性。
Browser enhancements
REST framework支持一些浏览器增强,比如基于浏览器的PUT,PATCH和DELETE表单。
.method
request.method返回http 请求方法,注意,一定是大写字母形式。
浏览器对PUT,PATCH和DELETE表单的支持都是透明的。
更多信息请查看browser enhancements documentation
.content_type
request.content_type返回描述http请求体media type的字符串,若media type没有提供,则返回一个空字符串。
通常你不需要直接去访问请求的content type,因为这通常依赖于REST framework的默认的请求解析行为。
如果你需要访问请求的content type,你应该优先使用.content_type属性,而不是request.META.get('HTTP_CONTENT_TYPE'),因为它对基于浏览器的非标单内容提供了透明支持。
更多信息请查看browser enhancements documentation
.stream
request.stream返回一个表示请求体内容的stream。
你通常不需要直接访问请求的内容,因为这通常依赖于REST framework的默认的请求解析行为。
Standard HttpRequest attributes
由于REST framework的Request扩展了Django的HttpRequest,因此DjangoHttpRequest中所有其它的标准属性和方法在这里也是可用的,比如request.META和request.session字典都可正常使用。
注意,由于实现原因,Request不继承HttpRequest,而是使用组合扩展类。