一、View类源码

image.png

as_view方法源码

as_view方法是视图类继承自View类
image.png
image.png

view方法

image.png

dispatch方法

image.png
image.png
self.http_method_names
image.png
self.http_method_not_allowed
image.png

总结

as_view一共做了两件事

  1. request对象及方法携带的参数赋值给当前视图类对象
  2. 返回当前类型的方法,如get

    二、应用

    在方法执行前后做些操作

    自定义dispatch方法

    1. def dispatch(self, request, *args, **kwargs):
    2. print('执行之前')
    3. ret = super().dispatch(request, *args, **kwargs)
    4. print('执行之后')
    5. return ret
    image.png
    image.png

    三、拓展

    装饰器替代dispatch

    既然是在前后加功能,那能不能用装饰器呢,当然可以。但是这里会有多个方法,如果加装饰器,需要给每个方法添加,语法不简洁,所以用重写dispatch方法的方式会更好。
    image.png

    dispatch的好处

    但是这里会有多个方法,如果加装饰器,需要给每个方法添加,语法不简洁,所以用重写dispatch方法的方式会更好。比如这样
    image.png

    method_decorator源码剖析

    但是在django中不能直接用装饰器符号,得用
    1. from django.utils.decorators import method_decorator
    2. @method_decorator(outer)
    因为django中复杂的代码,还有很多装饰器已经在使用或者已经提供好了等我们使用,如果简单的使用函数装饰器,会造成很多功能失效甚至出现bug,下面就是证据:简单打印了下源码的变量_dec
    image.png
    image.png

    django中正确使用装饰器

    image.png
    至于CBV(类视图)为何要特别加上额外的处理(method_decorator),这就涉及到知识点方法装饰器了,有空会在函数部分补充