CBV源碼解析
阿新 • • 發佈:2018-09-17
點擊 方式 app attr 簡單 返回 nbsp sed **kwargs
1、CBV(class based view)
首先定義一個視圖函數,用類的方式定義:
舉例:
class LoginView(View): def get(self,request): return render(request,"login.html")
url的設計:
#url(r‘^login/‘, views.LoginView.as_view()),
可以直接點擊as_view進入,但是我們正常走的話就是進入LoginView,繼承了View,然後是執行類裏邊的as_view方法,as_view是個類方法,執行後肯定有一個返回值,這個返回值就是view,
#url(r‘^login/‘, View.view),
然後是用戶訪問的時候執行的:
一旦用戶get訪問login:
走到view方法裏邊,執行self.dispatch,self就是我們自己定義的LoginView的實例對象。
#login-----》view(request): self = cls(**initkwargs) return self.dispatch(request, *args, **kwargs):
然後看這個類有沒有dispatch方法,在我們自己定義的裏邊沒有寫,但是繼承view裏邊有這個方法(源碼裏邊的東西):
def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn‘t exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn‘t on the approved list.
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
簡單來說就是:請求方式的分發,如果是get請求,執行get,是什麽就執行什麽:
# 分發 handler = getattr(self, request.method.lower()) return handler(request, *args, **kwargs): def get(self,request): return render(request,"login.html")
CBV源碼解析