关于Django REST framework源码认证流程的简单分析
一个URL对应一个视图函数,视图函数又可以分为CBV和FBV,Django REST framework采用的是CBV模式
首先请求进来,找到对应的类的as_view()函数,as_view()是一个APIVIew这个类的类装饰器函数。如下图;
再继续往下走,在APIView的as_view()方法中调用其基类View类的as_view()方法,即;
在View类中,有一个静态字段,请求方式与URL的对应关系会用到:
View类的as_view()函数:
注意:这是一个新的装饰器,继承了classmethod类,但重写了__get__的方法;
在View的as_view()函数中有一个view函数,在这个view函数中调用了自己的dispatch方法:即APIView的dispatch方法;
注:请求方式与URL的对应(反射);但注意这个dispatch与上面的dispatch方法不是同一个diapatch方法,它是View这个类里面的dispatch方法;
在APIView中调用自己的dispatch方法
其中再次调用了自己的initialize_request方法,将请求封装到Request对象中,即;
继续往下执行,调用自己的initial方法;
在initial方法中;
因为认证,权限,和限流是差不多的,所以我们以认证为例解析,注意:这个request是Request这个类,调用Request.user,是一个property方法
自己定义验证的方法,可以写一个类继承默认的类,再重写authenticate方法,并返回一个元组,
最后在Request类中;
如果没有通过验证,则返回一个元组(None,None);
这就是认证的大概流程,权限和限流的流程都类似,下次再写。