用它5分钟以后,我放弃用了四年的 Flask
有一个非常简单的需求:编写一个 HTTP接口,使用 POST 方式发送一个 JSON 字符串,接口里面读取发送上来的参数,对其中某个参数进行处理,并返回。
如果我们使用 Flask 来开发这个接口,那么代码是这样的:
from flask import Flask, requestapp = Flask(__name__)@app.route('/insert', methods=['POST'])
def insert():info = request.jsonname = info['name']age = info['age']age_after_10_years = age + 10msg = f'此人名叫:{name},10年后,此人年龄:{age_after_10_years}'return {'success': True, 'msg': msg}
复制代码
代码看起来已经很简洁了。我们用requests
发个请求看看效果,如下图所示:
看起来没什么问题。
现在,我搞点破坏,把age
字段改成字符串,再运行一下:
不出所料,报错了。
现在我们把age
字段改回数字,但是直接移除name
字段:
又报错了。
为了防止用户不按规矩提交数据,我们必需在接口里面做好各种异常数据的判断。于是增加判断以后的代码变得复杂了:
@app.route('/insert', methods=['POST'])
def insert():info = request.jsonname = info.get('name', '')if not name:return {'success': False, 'msg': 'name 参数不可省略,不可为空!'}age = info.get('age', 0)if not isinstance(age, int):return {'success': False, 'msg': 'age参数不是数字!'}age_after_10_years = age + 10msg = f'此人名叫:{name},10年后,此人年龄:{age_after_10_years}'return {'success': True, 'msg': msg}
复制代码
看来,用 Flask,虽然能让你用很短的代码写出一个能工作的项目。但要写成一个可以正常使用的项目,还是需要你自己写更多代码。
下面我们来看一下,现代化的 web 框架:FaskApi
能把这个工程简化到什么程度:
from fastapi import FastAPI
from pydantic import BaseModelapp = FastAPI()class People(BaseModel):name: strage: intaddress: strsalary: float@app.post('/insert')
def insert(people: People):age_after_10_years = people.age + 10msg = f'此人名字叫做:{people.name},十年后此人年龄:{age_after_10_years}'return {'success': True, 'msg': msg}
复制代码
我们还是使用 requests 发一条信息给 FastApi 开发的 HTTP接口。对于正常数据,正常使用:
现在我们把age
字段改成字符串:
返回友好的提示信息,告诉我类型错误:age 字段不是 integer
。
我们再试一试把name
字段去掉:
返回友好信息,提示值错误:name字段丢失
。
整个过程中,对类型的检查全都由 FastApi 自己完成。我们省下来很多时间。
我用了 Flask 四年,但在使用了5分钟 FastApi 以后,我决定以后不再使用 Flask 了。
回过头来,我们好好介绍一下 FastApi。
使用pip
或者pipenv
即可安装 FastApi:
pip install fastapi
pipenv install fastapi
复制代码
安装完成以后,我们来完成第一个 API:
from fastapi import FastAPIapp = FastAPI()@app.get('/')
def index():return {'message': '你已经正确创建 FastApi 服务!'}
复制代码
这里的写法跟 Flask 几乎一致。只不过在 Flask 中,我们定义路由的装饰器为@app.route('/')
。而这里写为@app.get('/')
如下图所示:
写好代码以后,我们需要使用uvicorn
来运行 FastApi。首先使用pip
或者pipenv
安装uvicorn
:
pip install uvicorn
pipenv install uvicorn
复制代码
然后执行命令:
uvicorn main:app --reload
复制代码
其中main
表示我们的代码文件为main.py
,app
表示我们初始化的FastApi 对象的名字。--reload
参数表示在修改了代码以后立即生效,不需要重启。
运行命令以后,我们访问http://127.0.0.1:8000
可以看到接口已经正确返回了 JSON 格式的数据:
那么如何定义一个带参数的 GET 方法呢?我们再写一段代码:
@app.get('/query/{uid}')
def query(uid):msg = f'你查询的 uid 为:{uid}'return {'success': True, 'msg': msg}
复制代码
写好代码以后,我们直接在浏览器里面访问新的地址,可以看到修改已经生效了,如下图所示:
如果想限定uid 只能是数字,不能是字符串怎么办呢?你只需要多加4个字符
:
@app.get('/query/{uid}')
def query(uid: int):msg = f'你查询的 uid 为:{uid}'return {'success': True, 'msg': msg}
复制代码
对函数query
的参数使用类型标注,标注为 int 类型。现在我们再来访问一下接口:
当 query 后面的参数不是整数时,正常报错了。
我们再来看一下本文一开始的 POST 方法。在使用 Flask 的时候,我们需要手动验证用户 POST 提交上来的数据是什么格式的,字段对不对。
但使用 FastApi 的时候,我们只需要类型标注就能解决所有问题。首先我们导入from pydantic import BaseModel
,然后继承BaseModel
实现我们允许 POST 方法提交上来的数据字段和格式:
from pydantic import BaseModelapp = FastAPI()class People(BaseModel):name: strage: intaddress: strsalary: float
复制代码
People
这个类通过类型标注,指定了它里面的4个字段和他们的类型。现在,我们来实现 POST 方法:
@app.post('/insert')
def insert(people: People):age_after_10_years = people.age + 10msg = f'此人名字叫做:{people.name},十年后此人年龄:{age_after_10_years}'return {'success': True, 'msg': msg}
复制代码
insert
函数的参数people
通过类型标注指定为People
类型。
当我们使用 POST 方式提交数据时,FastApi 自动会以People
中定义的字段为基准来校验数据,发现不对就返回报错信息。
除了开发接口变得非常简单外,FastApi 还会自动帮我们生成接口文档。大家访问http://127.0.0.1:8000/docs
,可以看到接口文档已经自动生成好了:
这个接口不仅能看,而且直接就能在接口页面修改样例数据,发送请求,现场测试:
以上是对 FastApi 的极简介绍。有兴趣的同学可以查阅它的官方文档
最后,告诉大家,FastApi 是一个异步 Web 框架,它的速度非常非常非常快。远远超过 Flask。
FastApi 是最快的几个 Web 框架之一。速度可以匹敌 Golang写的接口。
用它5分钟以后,我放弃用了四年的 Flask相关推荐
- flask get 参数_用它 5 分钟以后,我放弃用了四年的 Flask
" 阅读本文大概需要 3 分钟. " 有一个非常简单的需求:编写一个 HTTP 接口,使用 POST 方式发送一个 JSON 字符串,接口里面读取发送上来的参数,对其中某个参数进行 ...
- flask get 参数_Python web 用它5分钟以后,我放弃用了四年的 Flask
有一个非常简单的需求:编写一个 HTTP 接口,使用 POST 方式发送一个 JSON 字符串,接口里面读取发送上来的参数,对其中某个参数进行处理,并返回. 如果我们使用 Flask 来开发这个接口, ...
- GPS从入门到放弃(十四) --- 电离层延时
GPS从入门到放弃(十四) - 电离层延时 电离层概念 电离层(Ionosphere)是地球大气的一个电离区域.它是受到太阳高能辐射以及宇宙线的激励而电离的大气高层.50千米以上的整个地球大气层都处于 ...
- AutoLisp从入门到放弃(十四)
AutoLisp从入门到放弃(十四) AutoLisp选择集操作 AutoLisp从入门到放弃(十四) 一.ssget 1.函数说明 2.参数说明 3.代码示例 二.ssadd.ssdel 1.函数说 ...
- 一分钟理解三次握手和四次挥手
注:三次握手和四次挥手本身并不复杂,但却可以从很多角度理解这两个过程,本文仅取一个比较有趣的视点解释 为什么要三次握手? 答:三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收 ...
- 五分钟了解GRE是什么,四信GRE相关应用推荐
随着互联网新技术的发展以及智能化水平的提高,各企业对实时数据传输的需求也在不断提升,企业愈发重视数据中心的建设,各类虚拟网络技术相继被引入.今天,我们重点了解下云端"借道"鼻祖,善 ...
- 西柚的大数据从踩坑到放弃-zookeeper:四、一些ZK的踩坑记录
zookeeper踩坑记录 后续不断更新,希望能多积累一点以后方便自己维护的时候查询吧 Java api不能创建zk客户端,屏幕log提示超时,并伴随典型报错KeeperErrorCode = Con ...
- Lwip从入门到放弃之(四)---网络接口管理
对网络接口的有效管理,是协议栈能与外部进行通信的关键.我们把网络接口管理描述成链路层的部分,它旨在对具体网络硬件.软件进行统一的封装,并未IP层提供统一的接口服务. 为了实现对这些接口的管理,LwIP ...
- 【java】vertx从入门到放弃——入门(四)Codec
什么是Codec?概念这个玩意我是真不想说,毕竟我没有找到具体的概念,我自己大致的理解就是,用EventBus传输类的时候,对这个类进行序列化和反序列化的东西,因为vertx使用json进行传输,所以 ...
最新文章
- 微软对学生免费提供Visual Studio等开发软件(包括中国)
- C. Commentator problem
- 如何使用Cisdem Video Converter在Mac上将大型 AVI 转换为 MP4
- 9个适合web开发人员的CSS工具
- sqlite dev破解
- (四十七) 蓝牙自拍杆原理学习
- html梯形选项卡,css 梯形tab标签页
- html中pc端与移动端区别,盘点移动端和PC端交互设计上的区别
- ps抠图都有哪些方面,有哪些相关教程呢
- Spring AOP的术语:
- 小孩上楼梯的方式的种类
- 余世维 有效沟通3
- 超星计算机应用基础,计算机应用基础_超星_题库2020
- 电影票小程序插件 电影票CPS插件 电影票微信小程序插件
- 汇编NEG(求补/即求相反数)指令
- 触控板手势增强软件multitouch for mac
- 诺瓦科技 面经 测试
- excel乘法公式怎么输入_你加班3小时做的Excel表格,我只需1分钟!(建议收藏)
- win ce车载系统_【新器械】雅培在美国推出治疗慢性神经系统疼痛的IonicRF射频消融发生器...
- PHP 取URL根域名
热门文章
- 新年开工——相关性分析了解一下?
- js 中转换成list集合_java stream中Collectors的用法
- R语言ggplot2可视化、使用axis.ticks.length函数设置坐标轴间隔标签竖线的长度、并设置坐标轴间隔标签在图像内部(刻度标记放置在图像内部)
- _catboost.CatBoostError: C:/Program Files (x86)/Go Agent/pipelines/BuildMaster/catboost.git/catboost
- R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(手动编码添加均值、标准偏差)实战(dot plot)
- R语言dplyr包nth、first、last函数获取向量特定值实战
- R将字符串类型(Character)转化为因子类型(Factor)
- AR模型、MA(Moving Average)模型、ARMA模型、时间序列的定阶、ARIMA、SARIMAX
- 影像组学视频学习笔记(9)-T检验(T-test)理论及示例、Li‘s have a solution and plan.
- java操作excel常用的两种方式