Django CBV源码分析
django版本:2.2.22 # 你自己不要修改源码 出了bug很难搞 # 突破口urls.py url(r'^login/',views.MyLogin.as_view()) """ 函数名/方法名 加括号执行优先级最高 猜测 as_view() 要么是被@staticmethon修饰的静态方法 要么是被@classmethod修饰的类方法 正确 @classonlymethod def as_view(cls, **initkwargs): pass """ @classonlymethod def as_view(cls, **initkwargs): """ cls就是我们自己写的类 MyCBV Main entry point for a request-response process. """ def view(request, *args, **kwargs): self = cls(**initkwargs) # cls是我们自己写的类 # self = MyLogin(**initkwargs) 产生一个我们自己写的类的对象 return self.dispatch(request, *args, **kwargs) """ 以后你们会经常看源码 但是在看python源码的时候 一定要时刻提醒自己面向对象方法查找顺序 先从对象自己找 再去产生对象的类里面找 之后再去父类里面找 """ """ 总结:看源码只要看到了self点一个东西 一定要问你自己当前这个self到底是谁 """ return view # CBV的精髓 def dispatch(self, request, *args, **kwargs): # 获取当前请求的小写格式 然后对比当前请求方式是否合法 # get请求为例 # post请求 if request.method.lower() in self.http_method_names: handler = getattr(self, request.method.lower(), self.http_method_not_allowed) """ 反射:通过字符串来操作对象的属性或方法 handler = getattr(自己写的类产生的对象,'get',当找不到get属性或者方法的时候就会用第三个参数) handler = 我们自己写的类里面的get方法 """ else: handler = self.http_method_not_allowed return handler(request, *args, **kwargs) """ 自动调用get方法 """ # 要求:掌握到不看源码也能够描述出CBV的内部执行流程(******)
图解