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)
    源码分析
  • 相关阅读:
    Mac使用nginx+rtmp服务器
    iOS开发必不可少的76个工具
    AVPlayer缓存实现
    视频直播分析
    github部分有意思的库记录
    iOS四种多线程(swift和oc)
    Java的static关键字浅析
    JavaScript获取屏幕参数
    JavaScript中XMLHttpRequest实现跨域访问
    【CenchaTouch 学习笔记】Controller
  • 原文地址:https://www.cnblogs.com/zhang-yl/p/10473292.html
Copyright © 2011-2022 走看看