用它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 格式形成原因 关于形成的原因,在网上搜索了下,千奇百怪的都有,就不一一诉说了,可是有果必有 ...
随机推荐
- (数据科学学习手札90)Python+Kepler.gl轻松制作时间轮播图
本文示例代码及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 Kepler.gl作为一款强大的开源地理信 ...
- PG-跨库操作-dblink
在PostgreSQL数据库之间进行跨库操作的方式 dblink postgres_fdw 本文先说说dblink:dblink是一个支持从数据库会话中连接到其他PostgreSQL数据库的插件.在其 ...
- Electron-vue 项目搭建
Electron 应用技术体系推荐 目录结构 demo(项目名称) ├─ .electron-vue(webpack配置文件) │ └─ build.js(生产环境构建代码) | └─ dev-cl ...
- 使用python打造一款音乐播放器
作者qq:64761294 编程/考试交流群:834531270 欢迎交流 核心播放模块(pygame内核) import time import pygame import easygui as g ...
- 动态DP,ddp
动态DP?动态动态规划? 个人理解:动态DP,就是普通DP加修改操作,然后就变成了个毒瘤题. 直接就着例题写吧. 例题 P4719 [模板]"动态 DP"&动态树分治 求树 ...
- deepin换源
python的pip源 pip install pip -U pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/sim ...
- php三元运算符?:和??
1.(expr1) ? (expr2) : (expr3) 在 expr1 求值为 TRUE 时的值为 expr2,在 expr1 求值为 FALSE 时的值为 expr3. $a = (expr1) ...
- redis配置密码
一. 更改配置文件 找到requirepass这行, [soft@node5 redis-3.0.6]$ grep 'requirepass' redis.conf#requirepass fooba ...
- File类的基本概念与递归
一.File类 1.概念 File类:是文件和目录路径名的抽象表示形式. 即,Java中把文件或者目录(文件夹)都封装成File对象.也就是说如果我们要去操作硬盘上的文件,或者文件夹只要找到File这 ...
- Python的条件判断与循环
1.if语句 Python中条件选择语句的关键字为:if .elif .else这三个.其基本形式如下 if condition: blockelif condition: block...else: ...