2022-12-11 Django在战CBV源码
# CBV深度源码刨析入口url(r'^books2/', views.Books2.as_view())
1、as_view()是一个类方法,会把自己Books2传过去,通过可以看到源码返回一个view函数地址
2、view函数地址
def view(request, *args, **kwargs):
self = cls(**initkwargs) 是我们自己写的Books2类产生的对象-
产生一个我们自己写的类的对象]
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.request = request [当次请求处理来的request,赋值给Books2的对象]
self.args = args
self.kwargs = kwargs
return self.dispatch(request, *args, **kwargs)
3、view函数地址返回一个 return self.dispatch(request, *args, **kwargs)
我们首先要确定self是谁,self还是刚才Books2产生的对象,那么对象点dispatch有没有这个方法没有就从父类View中,发现有dispatch方法
4、def dispatch(self, request, *args, **kwargs)
# CBV的精髓所在
def dispatch(self, request, *args, **kwargs):
if request.method.lower() in self.http_method_names:
这个request是books2中的request,里面有自定义写的get方法-
还是Books2中的对象点http_method_names没有这个属性还是从父类View找发现有
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']]
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
# getattr:反射 通过字符串操作对象的属性或者方法
自己写的类产生的对象,'get',当找不到get属性或者方法时候就会用第三个参数是默认值的意思)]
else:
handler = self.http_method_not_allowed[通过源码可以看到相当于自己写的一些报错提示信息,返回的状态是405]
return handler(request, *args, **kwargs)[调用get方法
总结:Books2.as_view()是一个类方法---》返回view函数地址,并且把当次请求的request给Books2对象---》view函数地址调用返回父类的dispatch方法---》
判断是否在父类的http_method_names方法中,以为自己写的对象中没有(可以自己在Books2对象中写入这个就不会走父类的判断方法)---》getattr放射得到Books2写的get函数地址,在调用
页:
[1]