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

三、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)
源码分析
原文地址:https://www.cnblogs.com/zhang-yl/p/10473292.html