用它5分钟以后,我放弃用了四年的 Flask
有一个非常简单的需求:编写一个 HTTP接口,使用 POST 方式发送一个 JSON 字符串,接口里面读取发送上来的参数,对其中某个参数进行处理,并返回。
如果我们使用 Flask 来开发这个接口,那么代码是这样的:
from flask import Flask, request
app = Flask(__name__)
@app.route('/insert', methods=['POST'])
def insert():
info = request.json
name = info['name']
age = info['age']
age_after_10_years = age + 10
msg = 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.json
name = 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 + 10
msg = f'此人名叫:{name},10年后,此人年龄:{age_after_10_years}'
return {'success': True, 'msg': msg}
复制代码
看来,用 Flask,虽然能让你用很短的代码写出一个能工作的项目。但要写成一个可以正常使用的项目,还是需要你自己写更多代码。
下面我们来看一下,现代化的 web 框架:FaskApi能把这个工程简化到什么程度:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class People(BaseModel):
name: str
age: int
address: str
salary: float
@app.post('/insert')
def insert(people: People):
age_after_10_years = people.age + 10
msg = 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 FastAPI
app = 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 BaseModel
app = FastAPI()
class People(BaseModel):
name: str
age: int
address: str
salary: float
复制代码
People这个类通过类型标注,指定了它里面的4个字段和他们的类型。现在,我们来实现 POST 方法:
@app.post('/insert')
def insert(people: People):
age_after_10_years = people.age + 10
msg = 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写的接口。详细的对比可以看:one of the fastest Python frameworks available
文末福利
用它5分钟以后,我放弃用了四年的 Flask的更多相关文章
- Python爬虫从入门到放弃(十四)之 Scrapy框架中选择器的用法
Scrapy提取数据有自己的一套机制,被称作选择器(selectors),通过特定的Xpath或者CSS表达式来选择HTML文件的某个部分Xpath是专门在XML文件中选择节点的语言,也可以用在HTM ...
- 大白话5分钟带你走进人工智能-第四节最大似然推导mse损失函数(深度解析最小二乘来源)(2)
第四节 最大似然推导mse损失函数(深度解析最小二乘来源)(2) 上一节我们说了极大似然的思想以及似然函数的意义,了解了要使模型最好的参数值就要使似然函数最大,同时损失函数(最小二乘)最小,留下了一 ...
- 三分钟教你学Git(十四) 之 线下传输仓库
有时候还有一个人不能从远程直接clone仓库或者说由于非常大,clone非常慢或其他原因.我们能够使用bundle命令将Git仓库打包,然后通过U盘或者是其他介质拷贝给他,这样他拿到打包好的仓库后能够 ...
- 后端API入门到放弃指北
后端API入门学习指北 了解一下一下概念. RESTful API标准] 所有的API都遵循[RESTful API标准]. 建议大家都简单了解一下HTTP协议和RESTful API相关资料. 阮一 ...
- ElasticSearch入门系列(六)分布式操作
一.路由文档到分片 当你索引一个文档的时候,他被存储在单独一个主分片上.Elasticsearch根据一个算法来找到所在分片上. shard=hash(routing)%number_of_prima ...
- 2010 A B 2011 A B
湖南人文科技学院公共课 2010---2011学年第1学期<中国近代史纲要>课程考核试卷(A) 考核方式: (闭卷) ...
- 2012 A 《中国近现代史纲要》课程期末考试试卷
湖南人文科技学院2012—2013学年第1学期公共课 2011级<中国近现代史纲要>课程期末考试试卷 考核方式:(开卷) ...
- TCP/IP详解之:TCP
第17章 TCP:传输控制协议 TCP提供了一种可靠的面向连接的字节流运输层服务 TCP的服务 尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务. TCP通过下 ...
- 艰苦的RAW格式数据恢复之旅
艰苦的RAW格式数据恢复之旅 1.RAW 格式形成原因 2.RAW 格式的解决的方法 经验之谈: 1.RAW 格式形成原因 关于形成的原因,在网上搜索了下,千奇百怪的都有,就不一一诉说了,可是有果必有 ...
随机推荐
- 三个Python自动化测试高效工具的使用总结
##Python语言的特点 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号 ...
- 题解 CF 1372A
题目 传送门 题意 构造一个长度为n的数组,对于数组中的元素a,b,c,满足\(a+b\neq c\). 思路 直接让数组中的数全部变成1就可以了(其他数也行). 代码 /* * Author :We ...
- 设计模式:fly weight模式
目的:通过共享实例的方式来避免重复的对象被new出来,节约系统资源 别名:享元模式 例子: class Char //共享的类,轻量级 { char c; public: Char(char c) { ...
- C++语法小记---经典问题之一(一个空类包含什么)
问题:一个空类包含什么 空的构造函数 拷贝构造函数(浅拷贝) 重载赋值操作符函数(浅拷贝) 析构函数 取址运算符 取址运算符const 注意 所有的这些默认函数,只有在代码中调用了才会生成,否则也不会 ...
- MySQL的权限赋予
MySQL 赋予用户权限命令的简单格式可概括为:grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利. grant selec ...
- 一个文本框的各项说明,包括类似html的table
https://www.cnblogs.com/zhqiux/archive/2013/09/03/3298654.html
- I Hate It(区间最大问题,线段树)
很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时 ...
- 企业权限管理(SSM整合)(总结)
学于黑马程序员和传智播客联合做的教学项目 感谢 黑马程序员官网 传智播客官网 个人根据教程的每天的工作进度的代码和资料 密码:cti5 b站在线视频 微信搜索"艺术行者",关注并回 ...
- P5979 [PA2014]Druzyny dp 分治 线段树 分类讨论 启发式合并
LINK:Druzyny 这题研究了一下午 终于搞懂了. \(n^2\)的dp很容易得到. 考虑优化.又有大于的限制又有小于的限制这个非常难处理. 不过可以得到在限制人数上界的情况下能转移到的最远端点 ...
- Archlinux 最新安装方法 (2020.07.01-x86_64)之虚拟机 BIOS 安装
话不多说,直接上干货 准备 去Arch 官网,选择一个合适的国内镜像站下载 Arch 安装包 ISO,地址如下: https://www.archlinux.org/download/ 一.创建虚拟机 ...