Django中CBV(Class Base Views)模型原始碼分析
在view檔案中編寫一個類,並配置好路由
class Test(View): def get(self, request, *args, **kwargs): return HttpResponse('cbv_get') def post(self, request, *args, **kwargs): return HttpResponse('cbv_post')
url(r'test/',views.Test.as_view()),
通過as_view()進入檢視原始碼
實際上views.Test.as_view()是存的一個記憶體地址,加括號被呼叫,執行了as_view方法裡的view方法,具體看下圖:
核心是dispatch方法,在dispatch方法中完成了分發功能。
若要在Test類中自定義dispatch方法,程式碼如下:
class Test(View): def dispatch(self, request, *args, **kwargs): # 加程式碼 obj = super().dispatch(self, request, *args, **kwargs) # 加程式碼 # 實現了一個類似裝飾器的效果,比如post請求,如果是json,手動從request裡body取出來 再轉一下 # 或者走的時候加點cookie return obj def get(self, request, *args, **kwargs): return HttpResponse('cbv_get') def post(self, request, *args, **kwargs): return HttpResponse('cbv_post')
流程總結:
CBV模型
- 在views中寫一個類,繼承View,裡面寫get方法,post方法
- 在路由中配置: url(r'^test/', views.Test.as_view()),實際上第二個引數位置,放的還是一個函式記憶體地址
- 當請求來了,就會執行第二個引數(request,引數),本質上執行view()
- view內部呼叫了dispatch()方法
- dispatch分發方法,根據請求方式不同,執行的方法不同