flask中CBV使用

from flask import Flask, views

app = 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 Flask

app = Flask(__name__)

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

flask中的CBV和FBV的更多相关文章

  1. Flask中的CBV

    Flask中的CBV 第一种 class Index(views.MethodView): methods = ['GET', 'POST'] decorators = [] def get(self ...

  2. Django中的CBV和FBV

    Django中的CBV和FBV 一.  CBV CBV是采用面向对象的方法写视图文件. CBV的执行流程: 浏览器向服务器端发送请求,服务器端的urls.py根据请求匹配url,找到要执行的视图类,执 ...

  3. Flask(3)- flask中的CBV、werkzeug+上下文初步解读、偏函数和线程安全

    一.flask中的CBV 对比django中的CBV,我们来看一下flask中的CBV怎么实现? from flask import Flask, render_template, url_for, ...

  4. Flask中的CBV和上下文初步解读

    一 . flask中的CBV 相对于Django中的CBV,让我们来看看flask中的CBV是如何实现的 ? from flask import Flask, render_template, url ...

  5. Flask中的CBV以及正则表达式

    Flask中的CBV以及正则表达式 一.CBV def auth(func): def inner(*args, **kwargs): print('before') result = func(*a ...

  6. Flask 中的 CBV 与上传文件

    from flask import Flask, views, render_template, request app = Flask(__name__) app.config['DEBUG'] = ...

  7. Flask中的before_request装饰器和after_request装饰器以及WTForms组件

    一.before_request装饰器和after_request装饰器 我们现在有一个Flask程序其中有3个路由和视图函数 from flask import Flask app = Flask( ...

  8. Django的CBV和FBV

    一.FBV FBV(function base views) 就是在视图里使用函数处理请求,也是我们最开始接触和使用的方式,普通项目中最常见的方式. urls.py 1 2 3 4 urlpatter ...

  9. python自动化开发-[第二十天]-form表单,CBV和FBV,序列化

    1.CBV和FBV的用法 2.序列化用法 3.form表单 一.CBV和FBV 1.cbv是 class based view(基于类),fbv是function based view(基于函数) 2 ...

随机推荐

  1. Cookie的应用实例

    ASP.NET设置元素CSS属性 1.添加一条CSS规则: control.style.add("CSS名称",“CSS值”); 2.添加Class规则 Control.CSSCl ...

  2. 02.List泛型集合

    List泛型可以转换成数组 List泛型和数组的相同点: List泛型的数据类型必须是指定的,数组的数据类型也必须是指定的. List泛型和数组的不同点: List泛型的长度是随意的,而数组的长度必须 ...

  3. 转:如何利用已有的切片文件生成TPK

    Tpk是ArcGIS 10.1即将推出的一种新的数据文件类型,主要是用于将切片文件打包形成离线地图包.Tpk可以在ArcGIS Runtime中作为切片底图被加载.在ArcGIS 10.1中Tpk的生 ...

  4. java面试题----String、StringBuffer、StringBudder区别

    面试题1 - 什么情况下用+运算符进行字符串连接比调用StringBuffer/StringBuilder对象的append方法连接字符串性能更好? 面试题2 - 请说出下面程序的输出. class ...

  5. 一.配置简单的嵌入式tomcat和jetty

    我们写了一个web应用,打成war包后,就需要找一个server来部署.对于我们的实际应用,我们基本没必要自己再写一个嵌入式的server.接下来两篇文章只是以钻研的心态来学习一下嵌入式tomcat和 ...

  6. monkeyrunner之安卓开发环境搭建(二)

    在上一篇文章-安卓开发环境搭建中,我们创建并启动了eclipse自带的安卓模拟器,该模拟器不仅启动慢,而且在使用过程中的反应速度也是出奇的差,经常出现卡机现象.为了解决这种现象,因此,我们又寻找到了更 ...

  7. day005-异常

    1.        异常概念 1.1   异常的继承体系 异常的根类:java.lang.Throwable,其下有两个子类: Java.lang.Error Java.util.Exception  ...

  8. 网络防火墙之iptables的前世今生和归宿

    任何事物都有一个从无到有,再归于无的过程.是的,我这里用了一个绝对词:任何. 防火墙 在计算机领域中,防火墙(英文:Firewall)是一项协助确保信息安全的设备,会依照特定的规则,允许或是限制传输的 ...

  9. 再学UML-深入浅出UML类图(五)

    实例分析3——售票机控制程序 某运输公司决定为新的售票机开发车票销售的控制软件.图I给出了售票机的面板示意图以及相关的控制部件. 图I   售票机面板示意图 售票机相关部件的作用如下所述: (1) 目 ...

  10. 2.LVS配置过程

    请查看我的有道云笔记: http://note.youdao.com/noteshare?id=866edb5736418d29c86d68b5198c5c1c&sub=66F88F0A24D ...