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