【1119 | Day62】drf之请求模块
一、请求模块
-
drf的request是在wsgi的request基础上再次封装
-
wsgi的request作为drf的request一个属性:_request
-
新的request对旧的request做了完全兼容
-
新的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:
- 二次封装request
走drf的Request初始化方法
__init__
>>> self._request = request
drf的Request的getter方法__getattr__
>>> 先从self._request反射取属性,没取到再从drf的request中取- 三大认证
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。