FBV 和 CBV
FBV:funcation base view -- 基于函数的视图
CBV:class base view -- 基于类的视图
1、先写一个类
2、继承 View
3、url(r'^login/', views.Mylogin.as_view())
CBV 是根据请求方式区别访问哪个方法
"""
CBV
- 能够直接根据请求方式不同直接匹配对应的方法执行
"""
CBV 源码
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^analysis', views.MyLogin.as_view())
'''
函数名/方法名 加括号执行优先级最高
猜测:
1.as_view() 是被 @classmethod 修饰的类方法
2.as_view() 是被 @staticmethod 修饰的静态方法
'''
]
因此 CBV 与 FBV 在路由匹配上本质是一样的,都是路由对应函数的内存地址
def view(request, *args, **kwargs):
self = cls(**initkwargs) ==> selg = MyLogin(**initkwargs)
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
return self.dispatch(request, *args, **kwargs)
def dispatch(self, request, *args, **kwargs):
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
"""
反射:通过字符串来操作对象的属性或方法
handler = getattr(自定义的类产生的对象,请求方式,找不到该请求方式的属性或方法时就会使用第三个参数)
"""
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
在查看 Python 源码时,一定要时刻牢记面相对象属性方法查找顺序
- 先从对象自己找
- 再去产生对象的类里找
- 之后再去父类里找