flask中CBV使用

from flask import Flask, viewsapp = Flask(__name__)class Login(views.MethodView):methods = ['POST', 'GET']# 如果需要在CBV中加装饰器的话,括号里就是装饰器的内存地址,可以传多个decorators = ()def get(self):print('get 请求')return 'login get'def post(self):print('post 请求')return 'login post'app.add_url_rule('/login', view_func=Login.as_view(name='login'))if __name__ == "__main__":app.run(debug=True)

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

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

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

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

它做了下面这几件事:

  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 函数

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

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

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

    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的代码吧

from flask import Flaskapp = Flask(__name__)@app.route('/index')
def index():return "index page"if __name__ == "__main__":app.run(debug=True)

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

flask中的CBV和FBV相关推荐

  1. Flask中的CBV

    Flask中的CBV 在Flask中和Django一样有两种视图模式,一种是基于函数,一种是基于类.下面来讨论一下Flask的CBV模式. 首先,说明一下flask视图函数注册路由的本质: 其实,ro ...

  2. flask中的CBV , flask-session在redis中存储session , WTForms数据验证 , 偏函数 , 对象里的一些小知识...

    flask中的CBV , flask-session在redis中存储session , WTForms数据验证 , 偏函数 , 对象里的一些小知识 flask中的CBV写法 后端代码 # 导入vie ...

  3. Flask入门(4):CBV和FBV

    目录 4.CBV和FBV 4.1 继承 views.View 4.2 继承 views.MethodView 4.CBV和FBV 前面的例子中,都是基于视图函数构建视图(FBV),和Django一样, ...

  4. 视图层详解,cbv和fbv,文件上传

    day64 一.复习 二.视图层之请求对象 三.视图层之响应对象 补充知识之json序列化与反序列化 四.cbv和fbv 五.文件上传 六.postman软件 七.form表单,提交地址 八.Pych ...

  5. CBV与FBV的区别/CBV源码剖析

    FBV与CBV # 针对于视图函数(views.py),视图函数编写逻辑既可以使用函数(FBV)也可以使用类(CBV)来编写. 区别展示: login.html <h1>GET请求< ...

  6. flask中的request

    1.request是什么? 简单来说,它就是flask的封装的一个对象,这个对象包含着前端请求所带的所有信息.既然说它是一个对象,那么它肯定是有一些熟悉,和方法的,下面就来介绍下request里的熟悉 ...

  7. python flask 表单数据输出_将数据从HTML表单发送到Flask中的Python脚本

    我的Python脚本中有下面的代码: def cmd_wui(argv, path_to_tx): """Run a web UI.""" ...

  8. Flask框架(flask中的蓝图Blueprint)

    1. 我们学习Flask框架,开始的时候是把所有的视图函数等都写在一个文件中 我们在这单个文件中可以定义路由.视图函数.定义模型等等. 但这显然存在一个问题:随着业务代码的增加,将所有代码都放在单个程 ...

  9. Flask框架(flask-script扩展命令行和flask中数据库migrate扩展的使用)

    flask-script扩展命令行 1. 安装  : pip install  Flask-Script 2. 在程序中   from flask_script import Manager   '' ...

最新文章

  1. linux zynq ps dma,Zynq PS侧DMA驱动
  2. Linux安装Redis完整步骤
  3. java Hibernate
  4. 【论文】NAACL2019 抽取式摘要之 SUMO
  5. 高斯-勒让德积分学习
  6. Git 如何撤回某一次提交
  7. 未开票收入怎么申报?后期补票又怎么申报?
  8. nginx参数keepalive_timeout
  9. 【京东商城首页实战4】topbanner制作
  10. 更改C盘用户目录下的文件夹名称
  11. CentOS 根目录下目录介绍
  12. memcached面试专题
  13. 今日头条内推码URQVEYM社招,校招,实习应有尽有
  14. 制作linux只读文件系统,一种Squashfs只读根文件系统的远程升级方法及系统的制作方法...
  15. go build在mac系统下生成可执行文件时隐藏终端
  16. Maven报错Original error: Could not transfer artifact
  17. python3中的urllib.parse的常用方法
  18. 用PHP来统计在线人数的四个方法详解
  19. pta 构造哈夫曼树-有序输入 优先队列做法
  20. 【IDE】Eclipse中的workspace workingset 如何更好的搭配使用,以及本地项目文件夹的分类

热门文章

  1. VS.NET 学习方法论——我的VS.NET学习之旅
  2. 从默认的 _id 字段中,取得时间信息
  3. tomcat启动时出现错误
  4. Effective Modern C++:06lambda表达式
  5. 新东方雅思词汇---6.1、oppose
  6. [Bootstrap-插件使用]Jcrop+fileinput组合实现头像上传功能
  7. ant 安装及基础教程 !
  8. HDU5730 FFT+CDQ分治
  9. Installshield x:实现序列号检验,获取用户信息并写入指定_ini文件1 - 子夜 MySpace聚友博客...
  10. asp.net防类似DDOS攻击(CC攻击)代码