请求(Requests)

REST framework的Request类扩展了标准的HttpRequest,添加对REST framework的灵活请求解析和请求身份验证的支持。

请求解析(Request parsing)

REST framework的请求对象提供灵活的请求解析,允许你以通常处理表单数据相同的方式使用JSON数据或其他媒体类型处理请求。

.data

request.data返回请求正文的解析内容。这与标准的request.POST和reuqest.FILES属性类似。除了:

  • 它包括所有已解析的内容,包括文件和非文件输入。
  • 它支持解析除POST之外的HTTP方法的内容,这意味着可以访问PUT和PATCH请求内容。
  • 它支持REST framework灵活的请求解析,而不仅仅支持表单数据。例如,可以以与处理传入表单数据相同的方式处理传入的JSON数据。

    .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实例列表。
    通常情况下,不需要访问此属性。
    注意:如果客户端发送格式错误的内容,则访问request.data可能会引发ParseError。默认情况下,REST framework的API_VIEW类或@api_view装饰将捕获错误并返回400 Bad Reuqest相应。
    如果客户端发送的请求和内容类型无法解析,则会引发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的默认值是dajango.contrib.auth.models.AnonymousUser的实例。

.auth

request.auth返回任何附加的认证上下文。request.auth的确切行为屈居于正在使用的身份验证策略,但它通常可能是请求通过身份验证的令牌实例。
如果请求未经身份验证,或者没有附加上下文,则request.auth的默认值为None。

.authenticators

APIView类或@api_view装饰器将根据视图上设置的authentication_calsses或根据DEFAULT_AUTHENTICATORS设置确保将此属性自动设置为Authentication实例列表,
通常情况下,不需要访问此属性。

注意:调用.user.auth属性时,可能会引发WrappedAttributrError异常。这些错误源自认证器(authenticator)作为标准AttributrError,但是为了防止它们被外部属性访问修改,有必要重新设置为不同的异常类型。Python将无法识别来认证器(authenticator)的AttributeError,并会立即假定请求对象没有.user.auth属性。验证者需要修复。

浏览器增强

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的默认请求解析行为。

标准的HttpRequest属性

由于REST framework的Request扩展了Django的HttpRequest,所有其他标准属性和方法也可用。例如request.METArequest.session字典可用正常使用。
由于实现原因,Request类不会从HttpRequest类继承,而是使用组合扩展类。

0条评论

相关推荐

django教程

r

Django 2019-05-20 10:53:53

Celery

celery学习资料

Django 2019-05-25 18:41:55

django教程入门

适合django新人使用的学习手册

Django 2019-07-01 14:28:04

django实用资料

django项目从0到1自己总结的实用的资料,大部分常用的功能这里都有

Django 2019-05-08 18:21:34