DRF之APIView源码简析

一. 安装djangorestframework

  安装的方式有以下三种,注意,模块就叫djangorestframework。

  方式一:pip3 install djangorestframework

  方式二:pycharm图形化界面安装

  方式三:pycharm命令行下安装(会装在当前工程所用的解释器下)

二. APIView源码分析

  在此强调源码分析时一定要依据属性及方法的查询顺序从底部开始查询,不要直接ctrl + 鼠标左键点过去,因为可能跳过去的是其他类中的方法。除此之外只需搞清楚源码的流程思路即可,不需要每一行代码都要看懂。

  从使用rest_framework开始,尽量使用CBV类视图,首先导入APIView:

from rest_framework.views import APIView

  以往使用CBV时,我们都是继承django.views中的View,那么让我们来看看继承APIView有什么不一样。

class APIView(View):

  可以清楚看到APIView是继承了View的,继续往下:

  然后as_view中return的 csrf_exempt(view),让我们看看:

def csrf_exempt(view_func):
    """
    Marks a view function as being exempt from the CSRF view protection.
    """
    # We could just do view_func.csrf_exempt = True, but decorators
    # are nicer if they don't have side-effects, so we return a new
    # function.
    def wrapped_view(*args, **kwargs):
        return view_func(*args, **kwargs)
    wrapped_view.csrf_exempt = True
    return wraps(view_func, assigned=available_attrs(view_func))(wrapped_view)

  里面用了csrf_exempt函数,其实就是我们用来忽略csrf_token校验的装饰器(装饰器也就是一个函数,闭包函数),这意味着继承APIView的CBV将不再进行csrf_token的校验。

  然后调用父类的as_view后,父类返回的view被调用时执行self.dispatch():

  此时我们要清楚self是我们自定义的继承APIView的类的对象,依据属性与方法的查询顺序,我们从自定义的类中开始查找dispatch方法,一直到APIView类时,我们看看里面有没有dispatch方法:

  点击进入APIView所在模块时

  然后可以定位到APIView在文件中的位置,可以一眼看到它里面包含的东西:

  如果你显示的东西没有这么多,那么你只需要勾选配置中的show members即可:

  接着双击dispatch看看APIView重写的dispatch方法:

  发现initialize_request方法方法的是一个的对象,而且又是赋值给request,大胆猜测它是对原生request进行的封装

  接下来看看Request类中有什么名堂。

  那么当我们使用request的点语法时,如果找不到对应的属性或方法,那么会走类的__getattr__方法,所以Request类中重写了__getattr__方法,依次保证我们可以调用原生request的方法:

  接下来再看看initial方法:

  综述所述,APIView中主要是重写了dispatch方法,封装了原生request,为其提供了额外的属性与方法。除此之外,还提供了身份验证、权限验证以及频率校验。

原文地址:https://www.cnblogs.com/maoruqiang/p/11135335.html