django的CBV設計模式

1、什麼的是CBVhtml

cbv是class base view的縮寫,是django中基於類來設計視圖函數的,咱們一開始接觸的這種形式----path('login',views.login),叫fbv,是基於方法來設計視圖函數的。django

2、語法app

from django.contrib import admin
from django.urls import path
from app01 import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('login',views.login1),                          #fbv
    path('login/',views.LoginClass.as_view())   #cbv
]
from django.shortcuts import render,HttpResponse
from django.views import View
# Create your views here.

def login1(request):
    return


class LoginClass(View):

    def get(self,request):

        return render(request,'login.html')
    def post(self,request):
        print(request.POST.get('user'))
        print(request.POST.get('pwd'))
        return HttpResponse('ok...')
views

3、as_view()源碼分析ide

看cbv中,as_view()作了什麼事情函數

 1 #as_view()源碼執行流程
 2 #@classonlymethod
 3 def as_view(cls, **initkwargs):
 4 
 5     def view(request, *args, **kwargs):
 6         self = cls(**initkwargs)
 7         if hasattr(self, 'get') and not hasattr(self, 'head'):
 8             self.head = self.get
 9         self.request = request
10         self.args = args
11         self.kwargs = kwargs
12         return self.dispatch(request, *args, **kwargs)
13     return view
14 #第一步:LoginClass.as_view(),執行as_view()方法,返回view方法名,
15 #第二步:至關於path('login/',view),當有請求時,執行view方法
16 #第三步:self = cls(**initkwargs),cls是類名--LoginClass,因此self是一個LoginClass實例對象
17 #第四步:return self.dispatch(request, *args, **kwargs)  執行dispatch方法
18 #第五步:self沒有dispatch方法,去父類View中找,能找到dispatch
19 #第六步:若是請求方式--request.method.lower()在self.http_method_names列表中,利用反射在self實例對象中找到這個方法 賦值給handler
20 #第七步:執行handler ,將執行結果返回給調用者
21 def dispatch(self, request, *args, **kwargs):
22 
23     if request.method.lower() in self.http_method_names:
24         handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
25     else:
26         handler = self.http_method_not_allowed
27     return handler(request, *args, **kwargs)
源碼分析
相關文章
相關標籤/搜索