REST framework的Request
类扩展自标准的HttpRequest
,增加了REST framework灵活的请求解析和请求验证支持。
请求解析
REST framework的Request
对象提供了灵活的请求解析,让你可以像一般处理普通form数据一样处理带JSON数据或者媒体类型的request。
.data
request.data
返回request body解析后的内容。这类似于标准的request.POST
和request.FILES
属性除了下面几个区别:
- 它包含了所有解析后的内容,包括文件类型和非文件类型的输入
- 它支持除了
POST
类型以外的其他HTTP方法的内容解析,意味着你可以访问PUT
和PATCH
类型reqeust的内容。 - 它提供REST framework灵活的请求解析,而不单单支持from数据。举例说你可以像处理form数据一样处理JSON数据。
详细信息,参考parsers documentation
.query_params
request.query_params
是比request.GET
更贴切的一个同义词
为了清楚起见,在你的代码里,我们推荐你使用request.query_params
来代替Django's标准request.GET
。这样做可以让你的代码更准确和明了-任何HTTP方法类型都可能包含查询信息,不紧紧是GET请求。
.parsers
APIView
类或者@api_view
装饰器将保证这个属性会被自动赋予一系列的Parser实例,基于这个view的parser_class
集合或者基于DEFAULT_PARSER_CLASSES
设置
你一般不会访问这个属性
如果一个客户端发送了有缺陷的内容,那么访问request.data
也许会引起ParseError。默认情况下REST framework的APIView
类或者@api_view
装饰器将会捕获这个错误然后返回400 Bad Request
的response
如果一个客户端发送了一个包含有不能解析的content-type那么将会引起一个UnsupportedMediaType
异常,这个异常将会被捕获并且返回一个415 Unsupported Media Type response
。
内容协商
request暴漏了一些属性是允许你去判断内容协商阶段的结果。这将允许你去实现一些行为比如给不同的媒体类型选择一个不同的序列化方案
.accepted_renderer
内容协商阶段选出来的渲染器实例
.accepted_media_type
是一个字符串用来表明内容协商阶段接受的媒体类型
验证
REST framework提供了灵活的,针对每一个请求的验证,可以给你的这样的能力:
- 不同部分的API使用不同的验证策略
- 支持使用多个验证策略
- 同时提供即将到来的request相关的user和token信息
.user
request.user
一般返回django.contrib.auth.models.User
的一个实例,尽管它的行为取决于你使用的验证策略。
如果request没有验证,那么request.user
的默认值的django.contrib.auth.models.AnonymousUser
。
更多信息,查看authentication documentation
.auth
request.auth
返回任何额外的授权上下文。reqeust.auth
的具体行为取决于使用的认证策略,但一般来说它会是reqeuset请求授权得到token的实例。
更多详细信息请看 authentication documentation
.authenticators
APIView
类或者@api_view
装饰器将会保证这个属性被自动设置为一列Authentication的实例,基于authentication_classes
集合或者基于DEFAULT_AUTHENTICATORS
设置。
你一般不需要访问这个属性
浏览器增强
REST framework支持一些浏览器增强比如说是基于浏览器的PUT,PATCH和DELETE表单
.method
request.method返回请求的HTTP方法大写的字符串表达。
基于浏览器PUT,PATCH,DELETE表单被支持
.content_type
request.content_type
,返回一个代表HTTP请求body媒体类型的字符串对象,或者一个空串如果没有媒体类型提供的话。你一般不需要直接访问请求的内容类型,因为一般来说你会基于REST框架的默认解析行为
如果你确实需要访问request的媒体类型,你应该使用.content_type属性优先于使用request.META.get('HTTP_CONTENT_TYPE')
,因为它提供基于浏览器的非form内容。
.stream
request.stream
返回request body的流的展现方式
你一般不会直接访问request的内容,因为你一般会基于REST 框架的默认请求解析实现
标准HttpRequest属性
因为REST framework的Request类扩展自Django's的HttpRequest,所有其他的标准的属性和方法都是可用的。举例来说request.META
和request.session
字典都和之前一样
注意因为实现的原因,Request类不是直接继承子HttpRequest类,而是使用组合扩展了它