FBV 与 CBV
FBV(function base view), 基于函数的视图. url(r'^index/',函数名)
CBV(class base view), 基于类的视图.
from django import views
class MyLoginView(views.View):
def get(self,request):
return HttpResponse("from CBV get view")
def post(self,request):
return HttpResponse("from CBV post view")
url(r'^ab_cbv/',views.MyLoginView.as_view())
""" 如果请求方式是GET,则会自动执行类里面的get方法, 如果请求方式是POST则会自动执行雷里的post方法"""
CBV源码分析
1. 切入点: 路由匹配
类名.属性as_view并且还加了()
as_view可能输普通静态方法, 也可能输绑定给类的方法
2. 对象查找属性的顺序
先从自身开始, 再从产生对象的类, 之后是各个父类
MyLoginView.as_view()
先从我们自己写的MyLoginView中查找, 没有再去父类views里查找.
3. 函数名加()执行优先级最高.
url(r'^ab_cbv/',views.MyLoginView.as_view())
项目已启动就会执行as_view方法, 查看源码返回了一个闭包函数名view.
def as_view(cls):
def view(cls):
pass
return view
url(r'^ab_cbv/',views.view)
""" CBV与FBV在路由匹配本质上是一样的"""
4. 路由匹配成功之后执行view函数
def view():
self = cls()
return self.dispatch(request,*args,**kwargs)
5. 执行dispatch方法, 要注意查找的顺序
def dispatch():
handler = getattr(self,request.method.lower())
return handler(request,*args,**kwargs)
