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)插上,即冷插拔.我们通 ...
随机推荐
- 『忘了再学』Shell基础 — 28、AWK中条件表达式说明
目录 1.AWK的条件表达 2.条件表达式说明 (1)BEGIN (2)END (3)关系运算符 (4)说明AWK中条件表达式的执行过程 (5)AWK中使用正则表达式 (6)A~B练习 1.AWK的条 ...
- sort是不稳定排序
今天才知道sort是不稳定的,WA了一个点. sort()排序不是稳定排序,sort是主要用到了快速排序(平均时间复杂度为O(nlogn)),还结合了插入排序(时间复杂度为O(n2))和堆排序(时间复 ...
- MAUI与Blazor共享一套UI,媲美Flutter,实现Windows、macOS、Android、iOS、Web通用UI
1. 前言 距离上次发<MAUI初体验:爽>一文已经过去2个月了,本计划是下半年或者明年再研究MAUI的,现在计划提前啦,因为我觉得MAUI Blazor挺有意思的:在Android.iO ...
- 能快速搭建三维场景,这款3D全场景编辑器你还没用过吗?
今天就给大家分享一个非常好用的老子云3D全场景编辑器,不仅可以基于GIS数据,帮助用户快速搭建3D城市大场景.实现Web端流畅展示. 并且搭建的3D场景可离线开发成一个空间信息直观的.可交互.易于设计 ...
- Elasticsearch学习系列三(搜索案例实战)
Query DSL Es提供了基于JSON的完整查询DSL(Domain Specific Language 特定域的语言)来定义查询.将查询DSL视为查询的AST(抽象语法树).它由两种子句组成: ...
- Vue回炉重造之图片加载性能优化
前言 图片加载优化对于一个网站性能好坏起着至关重要的作用.所以我们使用Vue来操作一波.备注 以下的优化一.优化二栏目都是我自己封装在Vue的工具函数里,所以请认真看完,要不然直接复制的话,容易出错的 ...
- 在Ubuntu系统下,可执行文件的表现形式
在Windows系统下的可执行文件都带有.exe的后缀,而对于Linux系统下的可执行文件,则不会带有后缀,如下图 对于.txt文件,Ubuntu下也有相应的记事本程序打开,对于.xml,ubuntu ...
- ServletContext 对象
概念:代表整个Web应用 可以和程序的容器通信 (服务器) 获取 通过request对象获取 request.getServletContext(); 通过HTTPServlet获取 this.g ...
- bat-注册表修改win11右键风格
展开:reg add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32&q ...
- NC24724 [USACO 2010 Feb S]Chocolate Eating
NC24724 [USACO 2010 Feb S]Chocolate Eating 题目 题目描述 Bessie has received \(N (1 <= N <= 50,000)\ ...