django的CBV设计模式
一、什么的是CBV
cbv是class base view的缩写,是django中基于类来设计视图函数的,我们一开始接触的这种形式----path('login',views.login),叫fbv,是基于方法来设计视图函数的。
二、语法
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...')
三、as_view()源码分析
看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)