zoukankan      html  css  js  c++  java
  • FBV视图函数和CBV视图类

    FBV视图函数

    FBV(function base views) 就是在视图里使用函数处理请求,面向过程式的编程,
    

    CBV视图类

    #urls.py路由写法,其中views.login.as_view()中的login值得是处理这个路径相关请求的视图类
    url(r'^login/', views.login.as_view()),
    
    
    from django.views import View
    
    #请求login路径时执行的类
    class login(View):
        #重构父类View类的dispatch方法可以在处理请求之前和请求完成之后,添加一些处理的逻辑,
        #父类View的dispatch方法查看请求的类型,然后通过反射来调用本类中的对应函数,来处理请求
        #如果没有找到请求方式对应的函数,就会执行父类中dispatch的第三个参数,也就是报错
        def dispatch(self, request, *args, **kwargs):
            print(f'{request.method}请求来了')
            ret = super().dispatch(request, *args, **kwargs)
            print('逻辑处理完成')
            return ret
    	#如果是处理GET请求就直接定义get方法,父类View中的dispatch方法通过反射的方式来获取get函数来处理GET请求
        def get(self, request):
            print('111')
            return render(request, 'login.html')
    	#如果是处理POST请求就直接定义get方法,父类View中的dispatch方法通过反射的方式来获取POST函数来处理GET请求
        def post(self, request):
            print('222')
            return HttpResponse('登陆成功')
        
    #请求home路径时执行的类
    class home(View):
        def get(self, request):
            return render(request, 'home.html')
    
        def post(self, request):
            return HttpResponse('登陆成功')
    
        
    #视图类的源码流程:
    views.Addclass.as_view()
    1.程序加载,执行Addclass的类方法as_view
    	在本类中未找到,由于该类继承了View,因此去父类找找看,发现存在
    2.调用父类as_view的类方法(@classonlymethod)-->cls为Addclass
    该方法返回重点实现任务:
        1.定义了view方法
        2.并返回view
        请求到来时,执行下面操作
        3.结果变成执行view
        4.view的执行结果就是views.Addclass.as_view()的执行结果
    
    3.调用View的view方法
        1.self = cls(**initkwargs)因此self为Addclass类
        2.该函数返回self.dispatch(request, *args, **kwargs)
        3.需要先执行dispatch,并把执行结果返回给view函数
    
    4.执行View的dispatch方法
        1.获取request.method请求方式
        2.通过字符串的方式getattr(Addclass,'get')赋值给handler
        3.若不存在则返回报错信息给handler
        4.执行handler-->相当于执行get(request,*args,**kwargs)
        5.把结果return给view
    
    

    视图类加装饰器

    from django.views import View
    #如果要给视图类添加装饰器就要使用method_decorator这个方法
    from django.utils.decorators import method_decorator
    
    # 方式一:类装饰器,不常用
    @method_decorator(func, name='get')  # 给类中的某个方法添加装饰器,只能指向一个方法,
    @method_decorator(func, name='post')  # 如果要加多个,就再加一个装饰器,指向这个方法,
    class login(View):
    
        # 方式二:给dispatch添加装饰器,在请求处理之前和处理之后添加一些逻辑.
        @method_decorator(func)
        def dispatch(self, request, *args, **kwargs):
            print(f'{request.method}请求来了')
            ret = super().dispatch(request, *args, **kwargs)
            print('逻辑处理完成')
            return ret
    
        # 方式三:给执行的请求方式添加一个装饰器,在处理这个请求的时候,添加一些逻辑
        @method_decorator(func)
        def get(self, request):
            print('111')
            return render(request, 'login.html')
    
        def post(self, request):
            print('222')
            return HttpResponse('登陆成功')
    
  • 相关阅读:
    记一次内衣渗透
    mysql提权
    Token窃取与利用
    组策略首选项提权
    Windows错误配置提权
    windows内核溢出漏洞提权限
    xss漏洞
    mysql语句大全
    二叉树
    10个对所有学科都有用的Python数据可视化库
  • 原文地址:https://www.cnblogs.com/luckinlee/p/11622233.html
Copyright © 2011-2022 走看看