首页 > 编程语言 >APIView源码解析 和 Request类源码解析

APIView源码解析 和 Request类源码解析

时间:2022-09-26 21:22:06浏览次数:41  
标签:request Request 源码 csrf 解析 data view

APIView源码解析

入口也是as_view()apiview的as_view
里面调用了一个super()方法  调用父类的as_view
返回了一个csrf_exempt(viwe)  # 备注:所有的请求没有csrf的校验了
在函数上加上装饰器防止csrf的报错 本质就相当于这个csrf_exempt(viwe)
当请求来的时候,路由匹配成功会执行:
view类的as_view类方法内的view闭包函数 但是没有了csrf认证

image

# 真正执行的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

image

'''最核心的部分是在异常捕获这里'''
第四步:try 最核心的部分
   # 执行了 认证,频率,权限
第五步:在try中执行了if判断request.method的方法
第六步:在try中执行上面的认证的方法时出现了异常,能被捕获并处理(全局异常)

image

总结:
1.只要继承apiview 就没有csrf的认证
2.request对象变成了drf提供的Request类的对象
3.在执行视图函数类之前先执行了三大认证 (认证,频率,权限)
4.在执行认证的时候出现异常都会被捕获并处理,处理完就可以继续执行视图函数的方法

Request类源码解析

导入Request模块查看源码,类中有一个__getattr__ 方法   
#如果获取的属性不存在 会去django中的request中取属性 
查看对象属性的方法:对象.__dict__ 没有返回方法的时候就是不存在的属性
self._request 是django原生的request
通过getattr获取到的方法 获取到的就是django原生的request里面的方法

image

与request方法就是多了两个被@property装饰的方法:
1.data :
   无论获取哪种格式的数据 都可以直接用request.data
   (urlencoded,form-data,json)
2.query_params: 
    request.query_params等同于request.GET方法 

image

用装饰器让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

相关文章