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)插上,即冷插拔.我们通 ...
随机推荐
- unittest框架里的常用断言方法:用于检查数据
1.unittest框架里的常用断言方法:用于检查数据. (1)assertEqual(x,y) 检查两个参数类型相同并且值相等.(2)assertTrue(x) 检查唯一的参数值等于True(3)a ...
- [react] 什么是虚拟dom?虚拟dom比操作原生dom要快吗?虚拟dom是如何转变成真实dom并渲染到页面的?
壹 ❀ 引 虚拟DOM(Virtual DOM)在前端领域也算是老生常谈的话题了,若你了解过vue或者react一定避不开这个话题,因此虚拟DOM也算是面试中常问的一个点,那么通过本文,你将了解到如下 ...
- Kafka 的稳定性
一.事务 1. 事务简介 1.1 事务场景 producer发的多条消息组成⼀个事务这些消息需要对consumer同时可⻅或者同时不可⻅ producer可能会给多个topic,多个partition ...
- Amazon 消息订阅对接
亚马逊的api 谁用谁知道...... 除了坑还是坑 头疼一周整出来,分享给铁汁们 amazon 的订阅思维,我只能说外国人脑回路有点长 下面就讲讲具体流程步骤: 第一步: 参照官方教程:设置通知(A ...
- python requires模块 https请求 由于TLS协议版本太高导致错误
错误提示 requests.exceptions.SSLError: HTTPSConnectionPool(host='air.cnemc.cn', port=18007): Max retries ...
- React + Typescript领域初学者的常见问题和技巧
React + Typescript领域初学者的常见问题和技巧 创建一个联合类型的常量 Key const NAME = { HOGE: "hoge", FUGA: "f ...
- 基于.NET6的开源工业物联网网关
什么是工业物联网网关 工业物联网网关(IIoTGateway)是一种硬件设备或软件程序,作为本地设备(如PLC.扫码枪.机器人.数控机床.非标上位机等)与云端系统(如物联网平台.SCADA系统.MES ...
- react native 0.6x 在创建项目时,CocoaPods 的依赖安装步骤卡解决方案
前言 你需要做两件事 gem换源 pod repo 换源 实战 如果你已经成功安装了CocoaPods.那么这里你需要卸载它.gem换源1. 卸载CocoaPods 查看gem安装的东西 gem li ...
- 周报?谁还写周报啊?不都用Python小工具: 发个周报邮件给老板就行还写周报啊?不都用Python小工具: 发个周报邮件给老板就行
缘起: 新跳槽到一家公司, 没想到第一个挑战居然是每周都要发周报. 告诉老板这周都干了些什么和下周准备干什么. 我记性不好, 常常忘事儿.所以很多时候周报都会忘记发送. 于是, 就决定写一个小工具好了 ...
- Java 常用Set集合和常用Map集合
目录 常用Set集合 Set集合的特点 HashSet 创建对象 常用方法 遍历 常用Map集合 Map集合的概述 HashMap 创建对象 常用方法 遍历 HashMap的key去重原理 常用Set ...