zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    程序员:不要自称为码农
    SpringBoot对静态资源配置
    LeetCode 572. Subtree of Another Tree(子树)
    LeetCode 437. Path Sum III(统计路径和等于sum的路径数量)
    LeetCode 112. Path Sum(判断路径和是否等于一个数)
    LeetCode 617. Merge Two Binary Trees(归并两棵二叉树)
    LeetCode 226. Invert Binary Tree(翻转二叉树)
    Failure to transfer org.apache.maven.plugins:maven-resources-plugin:pom:2.6 的解决办法
    linux-查询某软件的安装的目录
    WebService概念解释
  • 原文地址:https://www.cnblogs.com/fengff/p/12426749.html
Copyright © 2011-2022 走看看