一、View类源码
as_view方法源码
view方法
dispatch方法
self.http_method_names
self.http_method_not_allowed
总结
as_view一共做了两件事
- 将
request对象
及方法携带的参数赋值给当前视图类对象
- 返回当前类型的方法,如
get
二、应用
在方法执行前后做些操作自定义dispatch方法
def dispatch(self, request, *args, **kwargs):
print('执行之前')
ret = super().dispatch(request, *args, **kwargs)
print('执行之后')
return ret
三、拓展
装饰器替代dispatch
既然是在前后加功能,那能不能用装饰器呢,当然可以。但是这里会有多个方法,如果加装饰器,需要给每个方法添加,语法不简洁,所以用重写dispatch方法的方式会更好。
dispatch的好处
但是这里会有多个方法,如果加装饰器,需要给每个方法添加,语法不简洁,所以用重写dispatch方法的方式会更好。比如这样
method_decorator源码剖析
但是在django中不能直接用装饰器符号,得用
因为django中复杂的代码,还有很多装饰器已经在使用或者已经提供好了等我们使用,如果简单的使用函数装饰器,会造成很多功能失效甚至出现bug,下面就是证据:简单打印了下源码的变量from django.utils.decorators import method_decorator
@method_decorator(outer)
_dec
django中正确使用装饰器
至于CBV(类视图)为何要特别加上额外的处理(method_decorator),这就涉及到知识点方法装饰器
了,有空会在函数部分补充