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的内部执行流程(******)

图解

原文地址:https://www.cnblogs.com/ZhZhang12138/p/14897085.html