【1119 | Day62】drf之请求模块

一、请求模块

  1. drf的request是在wsgi的request基础上再次封装

  2. wsgi的request作为drf的request一个属性:_request

  3. 新的request对旧的request做了完全兼容

  4. 新的request对数据解析更规范化:

    所有的拼接参数都解析到query_params中,所有数据包数据都被解析到data

    query_params和data属于QueryDict类型,可以 .dict() 转化成原生dict类型

二、原生Django CBV 源码分析:View

  • as_view()是入口,得到view函数地址
  • 请求来了调用view函数,内部调用dispatch函数完成请求分发
  • dispatch函数将请求方式映射成视图类的同名方法,完成请求的处理,得到相应
  • 再将相应的结果一层层返回

三、drf CBV 源码分析:APIView

  • as_view()是入口,得到view函数地址,在范围view函数地址时局部禁用csrf认证
  • 请求来了调用view函数,内部调用(APIView类的)dispatch函数完成请求分发
  • dispatch函数二次封装request完成三大认证后,再将请求方式映射成视图类的同名方法,完成请求的处理,得到响应再对相应做渲染处理
  • 再将相应的结果一层层返回

四、APIView做的处理

  • as_view: 就干了一件事,所有继承drf的基本视图类APIView的视图类,都不再做csrf认证校验
  • dispatch:
    1. 二次封装request

    走drf的Request初始化方法__init__ >>> self._request = request
    drf的Request的getter方法__getattr__ >>> 先从self._request反射取属性,没取到再从drf的request中取

    1. 三大认证

    self.initialize_request(request, *args, **kwargs)

五、request源码分析

# as_view()
 	# 核心走了父类as_view
     view = super(APIView, cls).as_view(**initkwargs)
     # 返回的是局部禁用csrf认证的view视图函数
     return csrf_exempt(view)

# dispatch(self, request, *args, **kwargs)
     # 二次封装request对象
     request = self.initialize_request(request, *args, **kwargs)
     # 自定义request规则
     self.initial(request, *args, **kwargs)

# initialize_request(self, request, *args, **kwargs)
 	 # 原生request封装在request._request

# initial(self, request, *args, **kwargs)
     # 认证
     self.perform_authentication(request)
     # 权限
     self.check_permissions(request)
     # 频率
     self.check_throttles(request)

核心:

request除了可以访问原wsgi协议的request所有内容,还可以访问 query_params、data。

posted @ 2019-11-19 19:35  fxyadela  阅读(107)  评论(0编辑  收藏  举报