FBV, CBV 源码分析

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)

posted @ 2022-06-24 20:59  Yietong  阅读(146)  评论(0)    收藏  举报