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('登陆成功')
    
  • 相关阅读:
    BZOJ3752 : Hack
    XIV Open Cup named after E.V. Pankratiev. GP of SPb
    XIII Open Cup named after E.V. Pankratiev. GP of Ukraine
    BZOJ2087 : [Poi2010]Sheep
    BZOJ2080 : [Poi2010]Railway
    BZOJ2082 : [Poi2010]Divine divisor
    Moscow Pre-Finals Workshop 2016. National Taiwan U Selection
    XIII Open Cup named after E.V. Pankratiev. GP of Asia and South Caucasus
    XIII Open Cup named after E.V. Pankratiev. GP of Azov Sea
    XIII Open Cup named after E.V. Pankratiev. GP of SPb
  • 原文地址:https://www.cnblogs.com/luckinlee/p/11622233.html
Copyright © 2011-2022 走看看