1. 程式人生 > >Django中CBV(Class Base Views)模型源碼分析

Django中CBV(Class Base Views)模型源碼分析

post請求 不同 res post方法 文件 方法 分享 () code

在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分發方法,根據請求方式不同,執行的方法不同

Django中CBV(Class Base Views)模型源碼分析