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請求方式來執行視圖類的不一樣請求方法

相關文章
相關標籤/搜索