zoukankan      html  css  js  c++  java
  • django FBV和CBV

    CBV(class base views) ---- 视图里使用类来处理请求

    from django.views import View
    # 导入一个django中自带的模块View
    class LoginViews(View):
        
        	# 重构了父类的dispatch方法,作用是可以在执行get或者post请求之前做一些逻辑判断
            def dispatch(self, request, *args, **kwargs):
                #调用父类的dispatch方法进行操作,不用写self,因为在使用super方法的时候默认就已经将类名传入了
            ret = super().dispatch(request, *args, **kwargs)
            return ret  # 接收到父类dispatch的返回值返回给重构后的dispatch这个方法
        
    	# 在View类中有一个dispatch方法,这个方法用到了反射,会在你的类中找get方法,
        def get(self,request):
            return render(request,'login.html')
    
        # 在View类中有一个dispatch方法,这个方法用到了反射,会在你的类中找post方法,
        def post(self,request):
            print(request.POST)  
            # 同样可以接收到post请求的数据<QueryDict: {'name': ['adrian'], 'pwd': ['123456']}>
            return HttpResponse('登陆成功')
    

    urls.py文件

    # 路有文件的写法
    url(r'^login/',views.LoginViews.as_view())
    

    控制器去视图中找LoginViews类,这个类都做了一些什么事?

    views.LoginViews.as_view()
    1.程序加载,执行LoginViews的类方法as_view
    在本类中未找到,由于该类继承了View,因此去父类找找看,发现存在
    2.调用父类as_view的类方法(@classonlymethod)-->cls为LoginViews
    该方法返回重点实现任务:
        1.定义了view方法
        2.并返回view
        请求到来时,执行下面操作
        3.结果变成执行view
        4.view的执行结果就是views.LoginViews.as_view()的执行结果
    	
    3.调用View的view方法
        1.self = cls(**initkwargs)因此self为LoginViews类
        2.该函数返回self.dispatch(request, *args, **kwargs)
        3.需要先执行dispatch,并把执行结果返回给view函数
    
    4.执行View的dispatch方法
        1.获取request.method请求方式
        2.通过字符串的方式getattr(LoginViews,'get')赋值给handler
        3.若不存在则返回报错信息给handler
        4.执行handler-->相当于执行get(request,*args,**kwargs)
        5.把结果return给view
        添加装饰器
    

    FBV( function base views) --- 视图里使用函数来处理请求

    def index(request):
        return render(request,'login.html')
    

    给视图加装饰器

    # 下面是装饰器
    def wrapper(func):
        def inner(*args,**kwargs):
            print('执行装饰器前')
            ret = func(*args,**kwargs)
            print('执行装饰器后')
            return ret
        return inner
    
    # 在函数上的应用,直接在函数的头部加上@+装饰器的名字
    @wrapper
    def index(request):
        return HttpResponse('这是一个数据')
    
    
    # 在类中的应用
    # 首先需要导入一个模块 :  这个模块是django自己带的,方便在类中加装饰器
    from django.utils.decorators import method_decorator  
    
    from django.views import View
    
    from django.utils.decorators import method_decorator
    #加装饰器的方法三
    @method_decorator(wrapper,name='get')
    @method_decorator(wrapper,name='post')
    class LoginViews(View):
    
        # @method_decorator(wrapper)  # 加装饰器的方法二
        def dispatch(self, request, *args, **kwargs):
            print('这是一个dispatch方法')
            ret = super().dispatch(request, *args, **kwargs)
            return ret
    
        # @method_decorator(wrapper)   # 加装饰器的方法方法一
        def get(self,request):
            print('这是get方法')
            return render(request,'login.html')
    
        def post(self,request):
            print('这是post方法')
            print(request.POST)  # <QueryDict: {'name': ['adrian'], 'pwd': ['123456']}>
            return HttpResponse('登陆成功')
    
    

    下面是将装饰器写在类中的方法头部

    下面是将装饰器写在自己类中定义的dispatch方中的执行效果

  • 相关阅读:
    django 模型ManyToMany 关联的添加,删除,查询
    js 购物车的数量加减,对应的总价也随机变化
    `Java`中`abstract class`与`interface`区别
    基于Netty的IdleStateHandler实现Mqtt心跳
    由MQTT topic的正则表达式匹配引发的特殊字符"/"匹配思考
    Maven项目配置Logback输出JSON格式日志
    MySql定时备份脚本
    使用tcpdump监控http流量
    Linux磁盘信息查询及删除文件操作
    基于Morphia实现MongoDB按小时、按天聚合操作
  • 原文地址:https://www.cnblogs.com/zhufanyu/p/11662897.html
Copyright © 2011-2022 走看看