zoukankan      html  css  js  c++  java
  • 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)
    源码分析
  • 相关阅读:
    大数据方向招人难啊!!
    .netcore 急速接入第三方登录,不看后悔
    T-SQL——函数——时间操作函数
    T-SQL——关于XML类型
    机器学习方法
    可读性友好的JavaScript:两个专家的故事
    快速了解 JavaScript ES2019 的五个新增特性
    了解 Vue 的 Compsition API
    使用 JavaScript 操作浏览器历史记录 API
    JavaScript ES 模块:现代化前端编程必备技能
  • 原文地址:https://www.cnblogs.com/zhang-yl/p/10473292.html
Copyright © 2011-2022 走看看