CBV源码分析
1.路由配置
path('index/', 视图类名.as_view()) # as_view是类的绑定方法
2.执行流程(分析)
path('index/', index),--->请求来了,路由匹配成功会执行 index(request,) path('index/', UserView.as_view()),---> 同样的,请求来了,路由匹配成功则会执行 UserView.as_view()(request)
3.入口:路由——从as_view()来开始分析
分析过程如下:
1.请求来了,路由匹配成功 2.执行 UserView.as_view()(request) -需要看as_view()执行结果是什么—— 结果为:view 代码如下: def view(request, *args, **kwargs): # 方法,可以加括号调用 return self.dispatch(request, *args, **kwargs) -其本质就是在执行 view(request) -本质在执行 self.dispatch(request, *args, **kwargs) 3.-去类(UserViwe类中找,找不到,就去父类View中找——谁调用的函数,就从谁最先开始找)中找dispatch,代码如下: def dispatch(self, request, *args, **kwargs): # request当次请求的请求对象,取出请求方式【假设是get请求】,将request.method的结果 'GET' 转成小写 'get' # http_method_names = ['get', 'post', 'put',....] # 条件成立,执行if内部代码 if request.method.lower() in self.http_method_names: #getattr:反射方法---》通过字符串去对象中取属性或方法 # self是谁的对象? 是视图类UserView的对象 # 取出来的handler 是 UserView这个类的get方法 handler = getattr(self, 'get') else: handler = self.http_method_not_allowed # handler是 UserView这个类的get方法 # get(request)---》触发UserView这个类的get方法---》真正执行原来视图函数的内容 # 最终返回 return handler(request, *args, **kwargs)
总结:
写cbv,只需要在视图类中写跟请求方式同名的方法即可 不同请求方式,就会执行不同的方法