flask 可插拔视图
Flask 0.7 版本引入了可插拨视图。可插拨视图基于使用类来代替函数,其灵感来自于 Django 的通用视图。
可插拨视图的主要用途是用可定制的、可插拨的视图来替代部分 实现。
普通的函数视图
演示代码
from flask import Flask, request
app = Flask(__name__)
@app.route("/", methods=['GET', 'POST'])
def hello():
method = request.method.upper()
return "hello %s" % method
if __name__ == "__main__":
app.run()
演示结果
C:\Users\jh>curl http://127.0.0.1:5000/
hello GET
C:\Users\jh>curl -d 'a=1' http://127.0.0.1:5000/
hello POST
这是一个普通的函数视图,使用的是route去注册url和函数绑定。
进而通过访问相关的url而访问相应的函数。
上例简单而灵活。但是如果要把这个视图变成一个可以用于其他模型和模板的通用视图,
那么这个视图还是不够灵活。因此,我们就需要引入可插拨的、基于类的视图。第一步, 可以把它转换为一个基础视图:
示例代码
from flask import Flask
from flask.views import View
app = Flask(__name__) class ShowHello(View):
def dispatch_request(self):
return 'Hello' app.add_url_rule('/', view_func=ShowHello.as_view('show_hello')) if __name__ == "__main__":
app.run()
演示结果
C:\Users\jh>curl http://127.0.0.1:5000/
Hello
有以下几个要点
1.必须创建一个flask.views.View的子类,并且执行dispatch_request方法。
2.必须通过使用 as_view() 方法把类转换为实际视图函数
基于方法的调度
对于 REST 式的 API 来说,为每种 HTTP 方法提供相对应的不同函数显得尤为有用。使用 flask.views.MethodView
可以轻易做到这点。在这个类中,每个 HTTP 方法 都映射到一个同名的类方法(名称为小写字母):
演示代码
from flask import Flask
from flask.views import MethodView
app = Flask(__name__) class ShowHello(MethodView):
def get(self):
return 'Hello get'
def post(self):
return 'Hello post' app.add_url_rule('/', view_func=ShowHello.as_view('show_hello')) if __name__ == "__main__":
app.run()
演示结果
C:\Users\jh>curl http://127.0.0.1:5000/
Hello get
C:\Users\jh>curl -d 'a=1' http://127.0.0.1:5000/
Hello post
C:\Users\jh>
装饰视图
视图函数会被添加到路由系统中,而视图类则不会。因此视图类不需要装饰,只能以手工 使用 as_view() 来装饰返回值:
演示代码
from flask import Flask, request
from flask.views import MethodView
app = Flask(__name__) class ShowHello(MethodView):
def get(self):
return 'Hello get'
def post(self):
return 'Hello post' def hello_required(f):
def decorator(*args, **kwargs):
method = request.method.upper()
if method == 'GET':
print('before get')
return f(*args, **kwargs)
return decorator view = hello_required(ShowHello.as_view('show_hello'))
app.add_url_rule('/', view_func=view) if __name__ == "__main__":
app.run()
演示结果
C:\Users\jh>curl http://127.0.0.1:5000/
Hello get
服务端日志
before get
127.0.0.1 - - [22/Aug/2022 16:36:17] "GET / HTTP/1.1" 200 -
一个类对应多种不同的请求方式
/user get 获取所有用户
/user post 创建一个用户
/user/<id> get 获取一个用户
/user/<id> put 更新一个用户
/user/<id> delete 删除一个用户
演示代码
from flask import Flask
from flask.views import MethodView
app = Flask(__name__) class User(MethodView):
def get(self, user_id):
if user_id:
return 'get one user userid: %s' % user_id
else:
return 'get all user'
def post(self):
return 'create new user' def put(self, user_id):
return 'update one user userid: %s' % user_id def delete(self, user_id):
return 'delete one user userid: %s' % user_id user_view = User.as_view('user_api')
app.add_url_rule('/user/', defaults={'user_id': None}, view_func=user_view, methods=['GET', ])
app.add_url_rule('/user/', view_func=user_view, methods=['POST', ])
app.add_url_rule('/user/<int:user_id>', view_func=user_view, methods=['GET', 'PUT', 'DELETE']) if __name__ == "__main__":
app.run()
演示结果
C:\Users\jh>curl http://127.0.0.1:5000/user/
get all user
C:\Users\jh>curl http://127.0.0.1:5000/user/1234
get one user userid: 1234
C:\Users\jh>curl -d 'user_id=1' http://127.0.0.1:5000/user/
create new user
C:\Users\jh>curl -X PUT http://127.0.0.1:5000/user/1234
update one user userid: 1234
C:\Users\jh>curl -X DELETE http://127.0.0.1:5000/user/1234
delete one user userid: 1234
flask 可插拔视图的更多相关文章
- Flask即插视图与tornado比较
由于公司使用了Tornado框架和Flask框架,之前一直使用的都是Flask框架,已经对url下面紧跟着视图的写法很固执.刚开始接触Tornado框架,对于其url和视图分开的写法思想上无法转变.今 ...
- 增加 addDataScheme("file") 才能收到SD卡插拔事件的原因分析 -- 浅析android事件过滤策略
http://blog.csdn.net/silenceburn/article/details/6083375 =========================================== ...
- Oracle12cr1新特性之容器数据库(CDB)和可插拔数据库(PDB) 的启动和关闭
Oracle12c中引入的多宿主选项(multitenant option)允许一个容器数据库容纳多个独立的可插拔数据库(PDB).本文将说明如何启动和关闭容器数据库(CDB)和可插拔数据库(PDB) ...
- Django中间件-跨站请求伪造-django请求生命周期-Auth模块-seettings实现可插拔配置(设计思想)
Django中间件 一.什么是中间件 django中间件就是类似于django的保安;请求来的时候需要先经过中间件,才能到达django后端(url,views,models,templates), ...
- 我心中的核心组件(可插拔的AOP)~大话开篇及目录
回到占占推荐博客索引 核心组件 我心中的核心组件,核心组件就是我认为在项目中比较常用的功能,如日志,异常处理,消息,邮件,队列服务,调度,缓存,持久化,分布式文件存储,NoSQL存储,IoC容器,方法 ...
- 我心中的核心组件(可插拔的AOP)~第二回 缓存拦截器
回到目录 AOP面向切面的编程,也称面向方面的编程,我更青睐于前面的叫法,将一个大系统切成多个独立的部分,而这个独立的部分又可以方便的插拔在其它领域的系统之中,这种编程的方式我们叫它面向切面,而这些独 ...
- 带卡扣的网卡接口使用小Tips,大家注意插拔网线的手法啊!
最近入手了一台X401,因为机器本身比较薄,它的网卡接口是有卡扣的,插网线的时候卡扣往下沉,这种设计应该有很多机型都采用了.但是大家有没有发现啊,这种接口的卡扣,时间长了,可能会有点松动.为了保护爱机 ...
- C#.NET U盘插拔监控
[1]涉及的知识点 1) windows消息处理函数 ? 1 protected override void WndProc(ref Message m) 捕获Message的系统硬件改变发出的系统消 ...
- ARM上的linux如何实现无线网卡的冷插拔和热插拔
ARM上的linux如何实现无线网卡的冷插拔和热插拔 fulinux 凌云实验室 1. 冷插拔 如果在系统上电之前就将RT2070/RT3070芯片的无线网卡(以下简称wlan)插上,即冷插拔.我们通 ...
随机推荐
- 用STM32玩OLED(显示文字、图片、动图gif等)
目录 用STM32玩OLED(显示文字.图片.动图gif等) 1. 显示字符串 2. 显示中文 3. 显示图片 4. 显示动图 5. 总结测试 用STM32玩OLED(显示文字.图片.动图gif等) ...
- 当运行npm install 命令的时候带上ignore-scripts,会发生什么?
摘要:运行npm install 命令的时候带上ignore-scripts, 可以避免一个恶意包里的病毒. 本文分享自华为云社区<运行npm install 命令的时候带上--ignore-s ...
- Python数据分析--Numpy常用函数介绍(6)--Numpy中与股票成交量有关的计算
成交量(volume)是投资中一个非常重要的变量,它是指在某一时段内具体的交易数,可以在分时图中绘制,包括日线图.周线图.月线图甚至是5分钟.30分钟.60分钟图中绘制. 股票市场成交量的变化反映了资 ...
- 接口开发-restful
数据库表设计 1 --员工表 2 create table Employee 3 ( 4 id NUMBER primary key, 5 employeeID NUMBER not null, 6 ...
- JAVA面向对象之封装和调用
一 面向对象 面向对象的三大特性 1 封装:概念:封装是把过程和数据私有化,打包封存起来,对数据访问只能通过指定的方式.简单的可以理解为你把钱存到银行里,银行专员首先要给你开一个账户,之后你的 ...
- 当JAVA注解、AOP、SpEL相遇,更多可能变为了现实
常规情况下,我们可以通过业务定制化的注解,借助AOP机制来实现某些通用的处理策略.比如定义个@Permission注解,可以用于标识在具体的方法上,然后用来指定某个方法必须要指定角色的人才能够访问调用 ...
- js中通过ajax调用网上接口
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- django--ORM表的多对一关系
多对一关系是什么 Django使用django.db.models.ForeignKey定义多对一关系. ForeignKey需要一个位置参数:与该模型关联的类 class Info(models. ...
- 配置nginx多域名虚拟主机
1.先做域名映射,由于我们使用的是阿里云域名. 登录阿里云控制台-->域名与网站(万网)-->域名-->选择一个域名-->域名解析-->添加记录 配置静态资源下载转发: ...
- Nacos配置失败(java.lang.IllegalStateException: failed to req API:/nacos/v1/ns/instance after all server)
解决: nacos服务器过载,可以删掉nacos文件夹下的data文件夹,重新启动.