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方法中判斷請求方式之前,請求...