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请求方式来执行视图类的不一样请求方法