FBV與CBV 及CBV原始碼分析

2022-01-20 12:54:43 字數 3262 閱讀 7057

fbv(function based view) 基於函式的檢視

基於函式的檢視,我們一直在用沒啥好講的,就是匯入模組呼叫函式執行業務

cbv(class based view) 基於類的檢視

路由

url(r'^haha/',views.zx_view.as_view()),

檢視

class zx_view(view):

def get(self,request):

return render(request,'edit.html')

def post(self,request):

return httpresponse("你好我是post")

cbv原始碼分析

首先我們的路由竟然是乙個函式(),這樣的話是直接執行的,我們找到返回值就行

url(r'^haha/',views.zx_view.as_view()),
進入原始碼

@classonlymethod

def as_view(cls, **initkwargs):

"""main entry point for a request-response process.

"""#views.zx_view.as_view(),我們呼叫的時候並沒有傳遞關鍵字引數,所以這個for可以跳過

#這裡有個函式但是並沒有執行

def view(request, *args, **kwargs):

self = cls(**initkwargs)

if hasattr(self, 'get') and not hasattr(self, 'head'):

self.head = self.get

self.request = request

self.args = args

self.kwargs = kwargs

return self.dispatch(request, *args, **kwargs)

#這裡在給函式物件新增屬性

view.view_class = cls

view.view_initkwargs = initkwargs

#下面的**有注釋,可以知道大概的功能

# take name and docstring from class

# and possible attributes set by decorators

# like csrf_exempt from dispatch

#最後把函式物件給返回去了

return view

路由就相當於是這個了

那麼就和fbv一樣了,路由觸發函式的執行

url(r'^haha/',view),
觸發路由檢視view是怎麼執行的

def view(request, *args, **kwargs):

#這個self是什麼,就是我們之前建立的zx_view類物件,這裡直接例項化了乙個self物件

self = cls(**initkwargs)

#通過反射獲取get方法

if hasattr(self, 'get') and not hasattr(self, 'head'):

self.head = self.get

#給self物件新增屬性

self.request = request

self.args = args

self.kwargs = kwargs

#最後執行self.dispatch(request, *args, **kwargs)

return self.dispatch(request, *args, **kwargs)

self.dispatch我們知道我們的zx_view是沒有這個方法的,那麼就去它的父類找dispatch這個方法,結果找到了

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

#獲取請求方法並轉換成小寫,判斷是否在http_method_names,http_method_names資訊下面那段**

#通過反射拿到zx_view的get或者post函式物件

#執行zx_view的get或者post函式物件,並返回結果,結束

CBV原始碼分析

html 這裡只是單純的用來做請求而已,沒什麼用處,只是讓後端來判斷走哪個方法 view from django.views import view class myreg view def get self,request return render request,reg.html def po...

Django框架 CBV及原始碼分析

cbv 基於類的檢視函式 示例 urls.py url r login views.mylogin.as view views.py from django.views import view class mylogin view defget self,request print from myl...

Django中CBV的執行順序之原始碼解析

django中的cbv的執行順序 下圖為cbv方式的執行順序,大概執行流程如下 其中淺藍色為在假設自己寫的類,即test類中沒有dispatch方法的情況下的執行順序,當自己的類中有dispatch方法時就執行自己的 黃色為不合法的請求方式時的執行流程,在dispatch方法中判斷請求方式之前,請求...