【djangorestframework】1、Requests(请求)

Requests

  • 如果你正在做基于REST的Web服务的东西..你应该忽略request.post
  • REST framework的Request类扩展了标准的HttpRequest,增加了对REST framework灵活的请求解析和请求认证的支持

请求解析

  • REST framework的Request对象提供了灵活的请求解析,允许你使用JSON数据或其他媒体类型像通常处理表单数据相同的方式处理请求
  • .data
    • request.data返回请求主题的解析内容。这与标准的request.POST和request.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装饰器将根据视图上设置的parser_classes或根据DEFAULT_PARSER_CLASSES设置确保将此属性自动设置为Parser实例列表。
    • 通常不需要访问此属性。
"""
注意:
	如果客户端发送格式错误的内容,则访问request.data可能会引发ParseError。默认情况下,REST framework的APIView类或@api_view装饰器将捕获错误并返回400 Bad Request响应。
    如果客户端发送的请求的内容类型无法解析,则会引发UnsupportedMediaType异常,默认情况下会被捕获并返回415 Unsupported Media Type响应
"""

内容协商(Content negotiation)

  • 请求公开了一些属性,这些属性允许你确定内容协商阶段的结果。这允许你实现一些行为,例如为不同的媒体类型选择不同的序列化方案
  • .accepted_renderer
    • 渲染器实例是由内容协商阶段选择的
  • .accepted_media_type
    • 内容协商阶段被接受的字符串表示的媒体类型

认证(Authentication)

  • REST framework提供灵活的每个请求认证,使能够:
    • 为你的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设置确保将此属性自动设置为Authentication实例列表,
    • 通常不需要访问此属性
"""
注意:
	调用.user或.auth属性时可能会引发WrappedAttributeError异常。这些错误源自认证器(authenticator)作为标准AttributeError,但是为了防止它们被外部属性访问修改,有必要重新设置为不同的异常类型。Python将无法识别来自认证器(authenticator)的AttributeError,并会立即假定请求对象没有.user或.auth属性。认证器(authenticator)需要修复
"""

浏览器增强

  • 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
    • .stream返回一个代表请求主体内容的流
    • 通常不需要直接访问请求的内容,因为通常会依赖REST framework的默认请求解析行为

标准的HttpRequest属性

  • 由于REST framework的Request扩展了Django的HttpRequest,所有其他标准属性和方法也可用。例如request.META和request.session字典可以正常使用
  • 请注意,由于实现原因,Request类不会从HttpRequest类继承,而是使用组合扩展类。
posted @ 2022-04-25 15:51  郭祺迦  阅读(119)  评论(0)    收藏  举报