Django中CBV View的as_view()源码解析

CBV与FBV路由区别闭包

urlpatterns = [
    url(r'^publish/$', views.Publishs.as_view()),  # CBV写法
    url(r'^publish/$', views.publish),    # FBV写法
]

咱们经过看FBV的写法能够得知,这里写的是一个内存地址,路由匹配成功会自动执行函数

CBV写的是类.as_view(),加括号意味着在项目启动就会执行,那么咱们大胆猜想,这里获得的也是一个函数地址。url

咱们来搂一眼源码:spa

果真,它返回了一个内存地址,并且是一个闭包函数3d

也就是说当路由匹配成功的时候会调用内部的view加括号code

那咱们须要进一步去看view里面干了些什么:对象

 

 

 咱们发现它调用了dispatch方法,此时的self是咱们的视图类对象,那么咱们在查找dispatch方法时须要先从自身找,自身咱们没有定义,那么此时就向父类找,最终在父类View里面找到了dispatch方法并调用blog

咱们知道了它调用了dispatch方法,那咱们来View里看看dispatch里面干了些什么:内存

 

 if 判断 请求方式是否是属于默认8大请求方式之一,若是是,经过反射,拿到self中定义的请求方法的函数地址路由

刚才咱们说到,self是咱们视图类的对象,那么这时候若是咱们在视图类中定义了该请求方式同名的方法,那么就会走该方法。

 

 这个时候咱们就应该有恍然大悟的感受了,as_view()最终干的事情就是根据request请求方式来执行视图类的不一样请求方法

相关文章
相关标签/搜索