请求(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.POSTrequest.FILES属性,除了下面的几点:

  • 它包含所有解析后的内容,包括文件非文件输入;
  • 它支持解析除POST之外的http请求的内容,也就是说,你可以访问PUTPATCH请求的内容;
  • 它支持REST framework灵活的请求解析,而不是仅仅支持表单数据。例如,你可以以处理表单数据的方式来处理传入的JSON数据。

要获取更详细的讲解,参考parsers documentation

.query_params

request.query_paramsrequest.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支持一些浏览器增强,比如基于浏览器的PUTPATCHDELETE表单。

.method

request.method返回http 请求方法,注意,一定是大写字母形式。 浏览器对PUT,PATCHDELETE表单的支持都是透明的。

更多信息请查看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.METArequest.session字典都可正常使用。

注意,由于实现原因,Request不继承HttpRequest,而是使用组合扩展类。

results matching ""

    No results matching ""