APIView源码解析
入口也是as_view()apiview的as_view
里面调用了一个super()方法 调用父类的as_view
返回了一个csrf_exempt(viwe) # 备注:所有的请求没有csrf的校验了
在函数上加上装饰器防止csrf的报错 本质就相当于这个csrf_exempt(viwe)
当请求来的时候,路由匹配成功会执行:
view类的as_view类方法内的view闭包函数 但是没有了csrf认证
# 真正执行的self.dispatch
首先去找apiview的as_view里的self.dispatch
第一步: def dispatch(self, request, *args, **kwargs)
这个request是原来dajngo的request
第二步: request = self.initialize_request(request, *args, **kwargs)
这个request是Request类的对象,新的request 相当于return Request(request)
第三步:self.request = request
相当于把视图类的request换成了这个= request
'''最核心的部分是在异常捕获这里'''
第四步:try 最核心的部分
# 执行了 认证,频率,权限
第五步:在try中执行了if判断request.method的方法
第六步:在try中执行上面的认证的方法时出现了异常,能被捕获并处理(全局异常)
总结:
1.只要继承apiview 就没有csrf的认证
2.request对象变成了drf提供的Request类的对象
3.在执行视图函数类之前先执行了三大认证 (认证,频率,权限)
4.在执行认证的时候出现异常都会被捕获并处理,处理完就可以继续执行视图函数的方法
Request类源码解析
导入Request模块查看源码,类中有一个__getattr__ 方法
#如果获取的属性不存在 会去django中的request中取属性
查看对象属性的方法:对象.__dict__ 没有返回方法的时候就是不存在的属性
self._request 是django原生的request
通过getattr获取到的方法 获取到的就是django原生的request里面的方法
与request方法就是多了两个被@property装饰的方法:
1.data :
无论获取哪种格式的数据 都可以直接用request.data
(urlencoded,form-data,json)
2.query_params:
request.query_params等同于request.GET方法
用装饰器让FBV的request方法拥有data属性
def out(func_name):
def inner(request, *args, **kwargs):
try:
request.data = request.POST
except:
request.data = json.loads(request.body)
res = func_name(request, *args, **kwargs)
return res
return inner
@out
def func(request):
print(request.data)
return JsonResponse({})
标签:request,Request,源码,csrf,解析,data,view
From: https://www.cnblogs.com/Hsummer/p/16732543.html