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...')
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)