• flask中的CBV和FBV


    flask中CBV使用

    1.  
      from flask import Flask, views
    2.  
       
    3.  
      app = Flask(__name__)
    4.  
       
    5.  
       
    6.  
      class Login(views.MethodView):
    7.  
      methods = ['POST', 'GET']
    8.  
      # 如果需要在CBV中加装饰器的话,括号里就是装饰器的内存地址,可以传多个
    9.  
      decorators = ()
    10.  
       
    11.  
      def get(self):
    12.  
      print('get 请求')
    13.  
      return 'login get'
    14.  
       
    15.  
      def post(self):
    16.  
      print('post 请求')
    17.  
      return 'login post'
    18.  
       
    19.  
       
    20.  
      app.add_url_rule('/login', view_func=Login.as_view(name='login'))
    21.  
       
    22.  
      if __name__ == "__main__":
    23.  
      app.run(debug=True)

    Login.as_view(name='login') 先对这段代码就行解析吧

    Login : 它是我们写一个视图类对吧

    as_view : 由类直接调用,他应该就是类里的一个函数(这里看不错它是对象方法,还是类方法,还是静态方法),

    因为类可以调用它下面的所有函数对吧,在我们的Login 并没有写as_view 这个函数,所以这个函数应该在它继承的类中,我们顺着这个基类去找找看,最终我们在View这个类中找到

    QQ%E5%9B%BE%E7%89%8720190303124357.png

    它做了下面这几件事:

    1. 最开始定义了一个view函数
    2. 再判断cls.decorators ,这里的cls就是我们所定义的视图类Login ,假如我们视图类没有写decorators 这个属性,那么最终会在View这个类中找到该属性,默认为一个空元组,所以说布尔值默认False,如果我们在自定义的试图类中假如的装饰器,也就是说decorators 它是有值的,一个元组或列表,最终会for循环decorators 的值,并一层一层的包裹,所以你写的装饰器顺序是需要注意下的
    3. 然后就是给view 函数赋值操作了,python中一切皆对象,所以这个函数也是一个对象
    4. 最后返回了定义的view 函数的内存地址
    5. 那么我们在创建路由和视图关系那里,也就是这条app.add_url_rule('/login', view_func=Login.as_view(name='login')),其中的view_func 应该是view的内存地址了
    6. 最后就会执行app.add_url_rule 这个函数,这个函数才会创建号路由视图之间的关系

    提醒一点:

    1. 在上面的app.add_url_rule 这个方法里,我并没有写endpoint 这个属性,那么最终会以view_func 所对应的函数的__name__ 方法作为endpoint 的值,那么我上面代码的基础上再写一个Register的视图函,再创建一个路由试图关系,也就是执行app.add_url_rule,他们的view_func对应的都是view函数的内存地址,你说会不会报错呢?

      答案:是不会报错的,因为你在as_view方法里传了一个name的参数,其实这个name相当于就是endpoint,所以这个name 你是不可以相同的,在as_view方法里,它有这样的一步操作view.__name__=name ,所以返回的view__name__ 的值是不同的。

    那么来了一个请求,它的url是/login ,然后这个视图类中是怎么执行的呢?

    1. 首先我们创建路由关系,比如这样的 "/login" -->> (这是允许请求的方法) -->> login(记住这是endpoint的值,其实他真正对应的是view这个函数的内存地址)

    2. 请求来了,便会去执行这个view 函数

      QQ%E5%9B%BE%E7%89%8720190303131534.png

      view.view_class :就是Login视图类,那么self就是Login的实例对象

      最终返回了 self.dispatch_request(*args, **kwargs)这个方法的返回值

    3. 很明显我们写的Login 视图类中没有dispatch_request这个方法,那么我们继续在它的基类里寻找,最终在MethodView这个基类里找到了

      QQ%E5%9B%BE%E7%89%8720190303132020.png

      1. request.method.lower() 就是这次请求的方法,self 就是Login的实例对象,

        通过getattr获取到以请求方法小写的方法的内存地址。这里根本没有判断该视图类允许的请求方法,所以说我在写视图类的时候,methods这个属性是不是可以不用写呢?等下我去试试

      2. 然后就是一系列的判断,断言什么的,很容易看懂就不说了

      3. 最终是执行了meth这个方法,将它的返回值返回回去

      4. 所以说view这个函数的返回值,也就是meth的返回值

    总结下CBV:

    1. 写一个定义CBV流程:

      1. 首先导入views,`from flask import views

      2. 自定义一个视图类,并且继承Views.MethodView

      3. 如果你要给你的视图类加装饰器的话,在该视图类中写decorator ,它是一个列表,你把装饰器函数的内存地址写进去好了

      4. 然后根据不同的请求,写相应的方法,比如对get请求写相关的方法,def get(self):pass 就好了,其他请求方法都是一个

      5. 最后配置好路由和视图函数之间的关系就好了

        app.add_url_rule('路径',view_func=视图类.as_view(name='一般就以视图类名小写吧,总之不能有重名'))

    2. 写执行CVB的流程

      1. 一个请求来了,通过url找到相应的view函数,加括号执行
      2. 再执行dispatch_request方法
      3. 通过本次请求的方式名小写,获取到视图类对应的方法名
      4. 执行该方法,最终将返回值返回。

    flask中FBV

    没啥好讲的,写段FVB的代码吧

    1.  
      from flask import Flask
    2.  
       
    3.  
      app = Flask(__name__)
    4.  
       
    5.  
      @app.route('/index')
    6.  
      def index():
    7.  
      return "index page"
    8.  
       
    9.  
       
    10.  
      if __name__ == "__main__":
    11.  
      app.run(debug=True)

    转载于:https://www.cnblogs.com/zhuchunyu/p/10466512.html

  • 相关阅读:
    linux的mount(挂载)NFS 共享,命令详解
    Ubuntu 14.04下NFS安装配置
    linux下实现ftp匿名用户的上传和下载文件功能
    ubuntu apache2配置详解(含虚拟主机配置方法)
    在Ubuntu Server下搭建LAMP环境
    RPM 命令
    阿里云主机ssh 免密码登录
    PHPMailer使用说明
    git的一些基础命令
    穿线
  • 原文地址:https://www.cnblogs.com/fengff/p/12426749.html
Copyright © 2020-2023  润新知