1. 程式人生 > >CBV源碼解析

CBV源碼解析

點擊 方式 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源碼解析