2018-04-24

     关于Django REST framework源码认证流程的简单分析

    一个URL对应一个视图函数,视图函数又可以分为CBV和FBV,Django REST framework采用的是CBV模式

    首先请求进来,找到对应的类的as_view()函数,as_view()是一个APIVIew这个类的类装饰器函数。如下图;

2018-04-24_第1张图片

再继续往下走,在APIView的as_view()方法中调用其基类View类的as_view()方法,即;

2018-04-24_第2张图片

在View类中,有一个静态字段,请求方式与URL的对应关系会用到:

View类的as_view()函数:

注意:这是一个新的装饰器,继承了classmethod类,但重写了__get__的方法;

在View的as_view()函数中有一个view函数,在这个view函数中调用了自己的dispatch方法:即APIView的dispatch方法;

2018-04-24_第3张图片

注:请求方式与URL的对应(反射);但注意这个dispatch与上面的dispatch方法不是同一个diapatch方法,它是View这个类里面的dispatch方法;

2018-04-24_第4张图片

在APIView中调用自己的dispatch方法

2018-04-24_第5张图片

其中再次调用了自己的initialize_request方法,将请求封装到Request对象中,即;

2018-04-24_第6张图片
2018-04-24_第7张图片
2018-04-24_第8张图片

继续往下执行,调用自己的initial方法;

2018-04-24_第9张图片

在initial方法中;

2018-04-24_第10张图片

因为认证,权限,和限流是差不多的,所以我们以认证为例解析,注意:这个request是Request这个类,调用Request.user,是一个property方法

2018-04-24_第11张图片
2018-04-24_第12张图片
2018-04-24_第13张图片

自己定义验证的方法,可以写一个类继承默认的类,再重写authenticate方法,并返回一个元组,

2018-04-24_第14张图片
2018-04-24_第15张图片

最后在Request类中;

2018-04-24_第16张图片

如果没有通过验证,则返回一个元组(None,None);


2018-04-24_第17张图片

这就是认证的大概流程,权限和限流的流程都类似,下次再写。

你可能感兴趣的:(2018-04-24)