flask中的CBV和FBV
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这个类中找到

它做了下面这几件事:
- 最开始定义了一个
view函数 - 再判断
cls.decorators,这里的cls就是我们所定义的视图类Login,假如我们视图类没有写decorators这个属性,那么最终会在View这个类中找到该属性,默认为一个空元组,所以说布尔值默认False,如果我们在自定义的试图类中假如的装饰器,也就是说decorators它是有值的,一个元组或列表,最终会for循环decorators的值,并一层一层的包裹,所以你写的装饰器顺序是需要注意下的 - 然后就是给
view函数赋值操作了,python中一切皆对象,所以这个函数也是一个对象 - 最后返回了定义的
view函数的内存地址 - 那么我们在创建路由和视图关系那里,也就是这条
app.add_url_rule('/login', view_func=Login.as_view(name='login')),其中的view_func应该是view的内存地址了 - 最后就会执行
app.add_url_rule这个函数,这个函数才会创建号路由视图之间的关系
提醒一点:
在上面的
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 ,然后这个视图类中是怎么执行的呢?
首先我们创建路由关系,比如这样的 "/login" -->> (这是允许请求的方法) -->> login(记住这是
endpoint的值,其实他真正对应的是view这个函数的内存地址)请求来了,便会去执行这个
view函数
view.view_class:就是Login视图类,那么self就是Login的实例对象最终返回了
self.dispatch_request(*args, **kwargs)这个方法的返回值很明显我们写的
Login视图类中没有dispatch_request这个方法,那么我们继续在它的基类里寻找,最终在MethodView这个基类里找到了
request.method.lower()就是这次请求的方法,self就是Login的实例对象,通过getattr获取到以请求方法小写的方法的内存地址。这里根本没有判断该视图类允许的请求方法,所以说我在写视图类的时候,
methods这个属性是不是可以不用写呢?等下我去试试然后就是一系列的判断,断言什么的,很容易看懂就不说了
最终是执行了
meth这个方法,将它的返回值返回回去所以说
view这个函数的返回值,也就是meth的返回值
总结下CBV:
写一个定义CBV流程:
首先导入views,`from flask import views
自定义一个视图类,并且继承
Views.MethodView如果你要给你的视图类加装饰器的话,在该视图类中写
decorator,它是一个列表,你把装饰器函数的内存地址写进去好了然后根据不同的请求,写相应的方法,比如对get请求写相关的方法,
def get(self):pass就好了,其他请求方法都是一个最后配置好路由和视图函数之间的关系就好了
app.add_url_rule('路径',view_func=视图类.as_view(name='一般就以视图类名小写吧,总之不能有重名'))
写执行CVB的流程
- 一个请求来了,通过url找到相应的
view函数,加括号执行 - 再执行
dispatch_request方法 - 通过本次请求的方式名小写,获取到视图类对应的方法名
- 执行该方法,最终将返回值返回。
- 一个请求来了,通过url找到相应的
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的更多相关文章
- Flask中的CBV
Flask中的CBV 第一种 class Index(views.MethodView): methods = ['GET', 'POST'] decorators = [] def get(self ...
- Django中的CBV和FBV
Django中的CBV和FBV 一. CBV CBV是采用面向对象的方法写视图文件. CBV的执行流程: 浏览器向服务器端发送请求,服务器端的urls.py根据请求匹配url,找到要执行的视图类,执 ...
- Flask(3)- flask中的CBV、werkzeug+上下文初步解读、偏函数和线程安全
一.flask中的CBV 对比django中的CBV,我们来看一下flask中的CBV怎么实现? from flask import Flask, render_template, url_for, ...
- Flask中的CBV和上下文初步解读
一 . flask中的CBV 相对于Django中的CBV,让我们来看看flask中的CBV是如何实现的 ? from flask import Flask, render_template, url ...
- Flask中的CBV以及正则表达式
Flask中的CBV以及正则表达式 一.CBV def auth(func): def inner(*args, **kwargs): print('before') result = func(*a ...
- Flask 中的 CBV 与上传文件
from flask import Flask, views, render_template, request app = Flask(__name__) app.config['DEBUG'] = ...
- Flask中的before_request装饰器和after_request装饰器以及WTForms组件
一.before_request装饰器和after_request装饰器 我们现在有一个Flask程序其中有3个路由和视图函数 from flask import Flask app = Flask( ...
- Django的CBV和FBV
一.FBV FBV(function base views) 就是在视图里使用函数处理请求,也是我们最开始接触和使用的方式,普通项目中最常见的方式. urls.py 1 2 3 4 urlpatter ...
- python自动化开发-[第二十天]-form表单,CBV和FBV,序列化
1.CBV和FBV的用法 2.序列化用法 3.form表单 一.CBV和FBV 1.cbv是 class based view(基于类),fbv是function based view(基于函数) 2 ...
随机推荐
- 利用Filter实现session拦截
1.在web.xml中配置 <!-- Session监听器 --> <filter> <filter-name>sessionValidateFilter</ ...
- 初学C#——选号器
private void Form1_Load(object sender, EventArgs e) { Random x = new Random(); ); //生成一个大于等于0,小于100之 ...
- 关于EF更新数据库,更新指定字段的设置
1.关于EF跟新数据库更新指定字段的设置 在EF提交到数据库的时候或许某些字段不想更新.或者自己更新一个模型到数据库去! 1.更新数据不更新一些字段 /// <summary> /// 数 ...
- ADO.NET教程(2)实现增删查改
声明一个类,在类中实现增删查改的方法 public class AdoNet { //声明连接字符串 public string Sqlstr = "data source={0};data ...
- python-requests 简单实现数据抓取
安装包: requests,lxmlrequest包用于进行数据抓取,lxml用来进行数据解析对于对网页内容的处理,由于html本身并非如数据库一样为结构化的查询所见即所得,所以需要对网页的内容进行分 ...
- 【JavaWeb】JSP九大内置对象
内置对象特点: 1. 由JSP规范提供,不用编写者实例化. 2. 通过Web容器实现和管理 3. 所有JSP页面均可使用 4. ...
- 《Hadoop权威指南》读书笔记1
<Hadoop权威指南>读书笔记 Day1 第一章 1.MapReduce适合一次写入.多次读取数据的应用,关系型数据库则更适合持续更新的数据集. 2.MapReduce是一种线性的可伸缩 ...
- iOS开发之GCD基础
重新回顾.学习GCD.Block.先贴出一篇不错的讲解GCD基础使用的文章 原文地址:http://blog.csdn.net/aolan1108/article/details/17283415 做 ...
- C#中.Net的值传递和引用传递
/// <summary> /// 电脑类 /// </summary> public class Computer { public string Type { get; s ...
- C#多线程和异步(二)——Task和async/await详解(转载)
一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...