有一个非常简单的需求:编写一个 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.pyapp表示我们初始化的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相关推荐

  1. flask get 参数_用它 5 分钟以后,我放弃用了四年的 Flask

    " 阅读本文大概需要 3 分钟. " 有一个非常简单的需求:编写一个 HTTP 接口,使用 POST 方式发送一个 JSON 字符串,接口里面读取发送上来的参数,对其中某个参数进行 ...

  2. flask get 参数_Python web 用它5分钟以后,我放弃用了四年的 Flask

    有一个非常简单的需求:编写一个 HTTP 接口,使用 POST 方式发送一个 JSON 字符串,接口里面读取发送上来的参数,对其中某个参数进行处理,并返回. 如果我们使用 Flask 来开发这个接口, ...

  3. GPS从入门到放弃(十四) --- 电离层延时

    GPS从入门到放弃(十四) - 电离层延时 电离层概念 电离层(Ionosphere)是地球大气的一个电离区域.它是受到太阳高能辐射以及宇宙线的激励而电离的大气高层.50千米以上的整个地球大气层都处于 ...

  4. AutoLisp从入门到放弃(十四)

    AutoLisp从入门到放弃(十四) AutoLisp选择集操作 AutoLisp从入门到放弃(十四) 一.ssget 1.函数说明 2.参数说明 3.代码示例 二.ssadd.ssdel 1.函数说 ...

  5. 一分钟理解三次握手和四次挥手

    注:三次握手和四次挥手本身并不复杂,但却可以从很多角度理解这两个过程,本文仅取一个比较有趣的视点解释 为什么要三次握手? 答:三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收 ...

  6. 五分钟了解GRE是什么,四信GRE相关应用推荐

    随着互联网新技术的发展以及智能化水平的提高,各企业对实时数据传输的需求也在不断提升,企业愈发重视数据中心的建设,各类虚拟网络技术相继被引入.今天,我们重点了解下云端"借道"鼻祖,善 ...

  7. 西柚的大数据从踩坑到放弃-zookeeper:四、一些ZK的踩坑记录

    zookeeper踩坑记录 后续不断更新,希望能多积累一点以后方便自己维护的时候查询吧 Java api不能创建zk客户端,屏幕log提示超时,并伴随典型报错KeeperErrorCode = Con ...

  8. Lwip从入门到放弃之(四)---网络接口管理

    对网络接口的有效管理,是协议栈能与外部进行通信的关键.我们把网络接口管理描述成链路层的部分,它旨在对具体网络硬件.软件进行统一的封装,并未IP层提供统一的接口服务. 为了实现对这些接口的管理,LwIP ...

  9. 【java】vertx从入门到放弃——入门(四)Codec

    什么是Codec?概念这个玩意我是真不想说,毕竟我没有找到具体的概念,我自己大致的理解就是,用EventBus传输类的时候,对这个类进行序列化和反序列化的东西,因为vertx使用json进行传输,所以 ...

最新文章

  1. 微软对学生免费提供Visual Studio等开发软件(包括中国)
  2. C. Commentator problem
  3. 如何使用Cisdem Video Converter在Mac上将大型 AVI 转换为 MP4
  4. 9个适合web开发人员的CSS工具
  5. sqlite dev破解
  6. (四十七) 蓝牙自拍杆原理学习
  7. html梯形选项卡,css 梯形tab标签页
  8. html中pc端与移动端区别,盘点移动端和PC端交互设计上的区别
  9. ps抠图都有哪些方面,有哪些相关教程呢
  10. Spring AOP的术语:
  11. 小孩上楼梯的方式的种类
  12. 余世维 有效沟通3
  13. 超星计算机应用基础,计算机应用基础_超星_题库2020
  14. 电影票小程序插件 电影票CPS插件 电影票微信小程序插件
  15. 汇编NEG(求补/即求相反数)指令
  16. 触控板手势增强软件multitouch for mac
  17. 诺瓦科技 面经 测试
  18. excel乘法公式怎么输入_你加班3小时做的Excel表格,我只需1分钟!(建议收藏)
  19. win ce车载系统_【新器械】雅培在美国推出治疗慢性神经系统疼痛的IonicRF射频消融发生器...
  20. PHP 取URL根域名

热门文章

  1. 新年开工——相关性分析了解一下?
  2. js 中转换成list集合_java stream中Collectors的用法
  3. R语言ggplot2可视化、使用axis.ticks.length函数设置坐标轴间隔标签竖线的长度、并设置坐标轴间隔标签在图像内部(刻度标记放置在图像内部)
  4. _catboost.CatBoostError: C:/Program Files (x86)/Go Agent/pipelines/BuildMaster/catboost.git/catboost
  5. R语言使用ggplot2包使用geom_dotplot函数绘制分组点图(手动编码添加均值、标准偏差)实战(dot plot)
  6. R语言dplyr包nth、first、last函数获取向量特定值实战
  7. R将字符串类型(Character)转化为因子类型(Factor)
  8. AR模型、MA(Moving Average)模型、ARMA模型、时间序列的定阶、ARIMA、SARIMAX
  9. 影像组学视频学习笔记(9)-T检验(T-test)理论及示例、Li‘s have a solution and plan.
  10. java操作excel常用的两种方式