CBV源码分析

发布时间 2023-11-29 15:26:15作者: wellplayed

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,只需要在视图类中写跟请求方式同名的方法即可
不同请求方式,就会执行不同的方法