郑统京 发表于 2022-10-13 19:57:59

大牛构思:FBV与CBV源码刨析

[突破口在urls.py]
url(r'^login/',views.MyLogin.as_view())[一切皆对象 MyLogin点as_view() 说明是访问他的方法或者属性,但是加括号了那就代表是他的方法,函数()执行优先级最高]
上述代码在启动django的时候会立刻执行as_view方法,执行优先级最高]
url(r'^login/',views.view) #FBV一模一样
CBV和FBV在路由匹配上本质是一样的 都是路由对应函数的地址
]
函数名/方法 加括号执行优先级最高
猜测
    as_view()
      [要么是被@staticmethod修饰的静态方法,(不传任何东西就是类的一个方法,普通函数)]
      [要么是被@classmethod修饰的类方法,(把类当做第一个参数传进去 )正确]
    @classonlymethod
    def as_view(cls, **initkwargs):
      pass

方法]
@classonlymethod
def as_view(cls, **initkwargs):
    def view(request, *args, **kwargs):
      self = cls(**initkwargs) # cls是我们自己写的类 MyLogin
      # self = MyLogin(**initkwargs)产生一个我们自己写的类的对象
      return self.dispatch(request, *args, **kwargs)
      以后会经常看源码,但是在看python源码的时候 一定要时刻提醒自己面向对象属性方法查找顺序
         1.先从对象自己找
         2.再去产生的对象找
         3.再去产生的父类找
         只要看源码self点一个东西当前的self到底是谁,才能明确上面的关系
    return view

方法]
CBV的精髓所在
    def dispatch(self, request, *args, **kwargs):
      # 获取当前请求的小写格式 然后比对当前请求方式是否合法
      # get请求为例
      if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
            # getattr:反射 通过字符串操作对象的属性或者方法
            # getattr(自己写的类产生的对象,'get',当找不到get属性或者方法时候就会用第三个参数
            # handle = 我们自己写的类里面的get方法 (查找顺序是自己对象init下欸有--》MyLogin里面有get方法)
      else:
            handler = self.http_method_not_allowed
      return handler(request, *args, **kwargs)
      # 自动调动get方法
页: [1]
查看完整版本: 大牛构思:FBV与CBV源码刨析