网易首页 > 网易号 > 正文 申请入驻

(入门篇)Python框架FastAPI:比Flask和Tornada更高性能的API 框架

0
分享至

用官方的话来说,FastAPI 是一种现代,快速(高性能)的 Web 框架,基于标准Python 类型提示使用 Python 3.6+ 构建 API

FastAPI 站在巨人的肩膀上?

很大程度上来说,这个巨人就是指 Flask 框架。

FastAPI 从语法上和 Flask 非常的相似,有异曲同工之妙。

技术背景:Py3.6+,Starlette,Pydantic

其实不仅仅是 FastAPI ,就连 Sanic 也是基于 Flask 快速开发的 Web API 框架。

废话少说,代码总是能给人带来愉悦感 (抱头),直接开怼。

安装

pip install fastapi
pip install uvicorn

创建一个 main.py 文件

from fastapi import FastAPI
app = FastAPI() # 创建 api 对象
@app.get("/") # 根路由
def root():
return {"武汉": "加油!!!"}
@app.get("/say/{data}")
def say(data: str,q: int):
return {"data": data, "item": q}

上面搭建了一个最简单的 FastAPI 应用,看起来和 Flask 完全一样,莫名的喜感。

使用以下命令来启动服务器:

uvicorn main:app --reload

FastAPI 推荐使用 uvicorn 来运行服务,Uvicorn 是基于uvloop 和 httptools 构建的闪电般快速的 ASGI 服务器。

uvicorn main:app 指的是:

main:文件main.py

app: 创建的启用对象

--reload: 热启动,方便代码的开发

启动界面如下:

INFO 信息告诉我们已经监听了本地的 8000 端口,访问 http://127.0.0.1:8000 得到结果

传入参数

再来看看 FastAPI 的异步代码

from fastapi import FastAPI
app = FastAPI() # 创建 api 对象
@app.get("/") # 根路由
async def root():
return {"武汉": "加油!!!"}
@app.get("/say/{data}")
async def say(data: str,q: int = None):
return {"data": data, "q": q}

开启服务后访问结果是一样的。

在上面的路由方法中,我们传入了一个 q 参数并且初始为 None,如果不给默认值,并且不传参,代码将直接报错。

来看看 FastAPI 是如何处理错误的:

可以看到,即使是报错,也是优美的输入一个带有错误字段的 JSON,这就非常的友好了,这也是体现了 FastAPI 减少更多的人为错误的特性,返回也更加的简洁直观。

在命令行输出:

再来看看 FastAPI 的交互文档

根据官方文档,打开 http://127.0.0.1:8000/docs

看到:

支持动态传入数据:

结果:

从交互体验上也是无比的友好,让代码在生产中更加健壮。

现在我们算是快速的体验了一波 FastAPI 骚操作,从代码上和 Flask 及其的类似,体验性更好。

那么再来看看最新的 Python web框架的性能响应排行版

从并发性上来说是完全碾压了 Flask (实际上也领先了同为异步框架的tornado 不少),看来 FastAPI 也真不是盖的,名副其实的高性能 API 框架呀!

查询参数

先来看看官方小 demo

from fastapi import FastAPI
app = FastAPI()
fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}, {"item_name": "Baz"}]
@app.get("/items/")
async def read_item(skip: int = 0, limit: int = 10):
return fake_items_db[skip : skip + limit]

该查询是 ? URL中位于关键字之后的一组键值对,以字符分隔。

&

在 url 中进行查询

http://127.0.0.1:8000/items/?skip=0&limit=10

skip:查询的起始参数

limit:查询的结束参数

成功返回查询列表。

查询参数类型转换

FastAPI 非常聪明,足以辨别 路径参数 和 查询参数。

来看看具体的例子:

from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: str, q: str = None, short: bool = False):
item = {"item_id": item_id}
if q:
item.update({"q": q})
if not short:
item.update(
{"description": "This is an amazing item that has a long description"}
)
return item

看看其访问路径,执行以下的任何一种 url 访问方式

http://127.0.0.1:8000/items/武汉加油?short=1

http://127.0.0.1:8000/items/武汉加油?short=True

http://127.0.0.1:8000/items/武汉加油?short=true

http://127.0.0.1:8000/items/武汉加油?short=on

http://127.0.0.1:8000/items/武汉加油?short=yes

可以发现任何大小写的字母等都会被转换成 bool 值的参数 True,这就是所谓模糊验证参数,对于开发者来说这是个好消息。

要知道的是,如果 short 参数没有默认值,则必须传参,否则 FastAPI 将会返回类似以下的错误信息。

{
"detail": [
{
"loc": [
"query",
"needy"
],
"msg": "field required",
"type": "value_error.missing"
}
]
}

创建数据模型

前面说到 FastAPI 依赖 Pydantic 模块,所以首先,你需要导入 Pydantic 的 BaseModel 类。

from fastapi import FastAPI
from pydantic import BaseModel
# 请求主体类
class Item(BaseModel):
name: str = "武汉加油 !!"
description: str = None
price: float = 233
tax: float = None
app = FastAPI()
@app.post("/items/")
async def create_item(item: Item):
return item

发送 post 请求来提交一个 Item(请求主体) 并返回,来看看提交过程。

成功提交并返回 200 状态码

请求主体+路径+查询参数,在请求主体的基础上加入 url 动态路径参数 和 查询参数

from fastapi import FastAPI
from pydantic import BaseModel
class Item(BaseModel):
name: str
description: str = None
price: float
tax: float = None
app = FastAPI()
@app.put("/items/{item_id}")
async def create_item(item_id: int, item: Item, q: str = None):
result = {"item_id": item_id, **item.dict()}
if q:
result.update({"q": q})
return result

put 方法用于更新,传入参数后成功返回一个字典。

关于模板引擎

FastAPI 不像 Flask 那样自带 模板引擎(Jinja2),也就是说没有默认的模板引擎,从另一个角度上说,FastAPI 在模板引擎的选择上变得更加灵活,极度舒适。

以 Jinja2 模板为例

安装依赖

pip install jinja2
pip install aiofiles # 用于 fastapi 的异步静态文件

具体的用法

# -*- coding:utf-8 -*-
from fastapi import FastAPI, Request
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
import uvicorn
app = FastAPI()
app.mount("/static", StaticFiles(directory="static"), name="static") # 挂载静态文件,指定目录
templates = Jinja2Templates(directory="templates") # 模板目录
@app.get("/data/{data}")
async def read_data(request: Request, data: str):
return templates.TemplateResponse("index.html", {"request": request, "data": data})
if __name__ == '__main__':
uvicorn.run(app, host="127.0.0.1", port=8000)

html 文件渲染


武汉加油title>
head>

高呼: {{ data }}h1>
body>
html>

在浏览器键入 http://127.0.0.1:8000/data/武汉加油

值得注意的是,在返回的 TemplateRespone 响应时,必须带上 request 的上下文对象,传入参数放在同一字典。

这样一来,又可以像 Flask 一样的使用熟悉的 Jinja2 了,哈哈。

做个小总结的话就是 FastAPI 在用法上也是及其简单,速度更快,性能更好,容错率更高,整体上更牛逼。但是我在设想如此之快的框架,毕竟发布的时间不长,缺少像 Flask 框架的第三方库和各种插件,所以要想真正意义上替代还是需要一定的时间,要冷静,冷静。

好啊,至此 FastAPI 的一些基本用法就差不多结束啦,FastAPI 的官方文档有详细的介绍和实例,入门篇到此结束。

官方文档:https://fastapi.tiangolo.com/

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
外交部:中方欢迎特朗普总统对中国进行国事访问

外交部:中方欢迎特朗普总统对中国进行国事访问

界面新闻
2026-05-13 15:24:33
“史上最严” 新规执行近半年,江苏电动自行车企业赚翻了?

“史上最严” 新规执行近半年,江苏电动自行车企业赚翻了?

星星苏讯
2026-05-12 17:38:40
新冠后遗症对人体的最大影响,很多人深受其害,有些人还不自知

新冠后遗症对人体的最大影响,很多人深受其害,有些人还不自知

呼吸科大夫胡洋
2026-02-22 11:39:12
5月,遇到这水果别手软,一次买20斤,晒干后美味翻倍,营养解馋

5月,遇到这水果别手软,一次买20斤,晒干后美味翻倍,营养解馋

阿龙美食记
2026-05-13 14:06:46
红酒白酒全面崩盘,中国人为啥突然不愿意喝酒了呢?

红酒白酒全面崩盘,中国人为啥突然不愿意喝酒了呢?

流苏晚晴
2026-05-12 19:17:02
30万亿!中国存款第一城诞生,A股大涨功不可没,北京万亿存款搬家,人均住户存款直逼36万元

30万亿!中国存款第一城诞生,A股大涨功不可没,北京万亿存款搬家,人均住户存款直逼36万元

金融界
2026-05-13 20:41:46
白鹿迎来全网骂潮,是因为她踩中了,中国观众最讨厌的3个雷区

白鹿迎来全网骂潮,是因为她踩中了,中国观众最讨厌的3个雷区

阿凫爱吐槽
2026-05-14 02:15:54
梁安琪带奚梦瑶扫货豪宅,同层豪掷1.68亿,拿下三套李泽楷新楼盘

梁安琪带奚梦瑶扫货豪宅,同层豪掷1.68亿,拿下三套李泽楷新楼盘

素衣读史
2026-05-12 21:57:21
2026楼市重磅信号:房产税箭在弦上,持房者必缴税

2026楼市重磅信号:房产税箭在弦上,持房者必缴税

领悟看世界
2026-05-14 00:20:48
高三晒家长“开天窗”穿搭,被嘲:该端庄的时候,你解扣子干嘛?

高三晒家长“开天窗”穿搭,被嘲:该端庄的时候,你解扣子干嘛?

妍妍教育日记
2026-05-10 11:50:07
伟哥不香了?干细胞“重启”男性功能:从撑几小时到真正硬起来

伟哥不香了?干细胞“重启”男性功能:从撑几小时到真正硬起来

思思夜话
2026-05-13 12:10:16
网传华工男生在教室偷拍女生?校方:情况属实,依规给予处分

网传华工男生在教室偷拍女生?校方:情况属实,依规给予处分

南方都市报
2026-05-13 17:36:31
武汉博物馆辟谣!严正声明这条招聘信息不实

武汉博物馆辟谣!严正声明这条招聘信息不实

极目新闻
2026-05-13 18:08:20
45岁小沈阳被曝十天进两次急诊,背后原因太心酸,给中年人提个醒

45岁小沈阳被曝十天进两次急诊,背后原因太心酸,给中年人提个醒

青梅侃史啊
2026-05-14 07:21:59
新生儿腰斩、房价下跌?别怪政策了,这才是中国经济的残酷真相!

新生儿腰斩、房价下跌?别怪政策了,这才是中国经济的残酷真相!

冷夜说
2026-05-11 20:31:08
中国男乒四大“贵公子”:家境优渥不缺钱,仍为梦想拼尽全力

中国男乒四大“贵公子”:家境优渥不缺钱,仍为梦想拼尽全力

郭揦包工头
2026-04-29 16:09:40
许家印的风尘知己

许家印的风尘知己

哲空空
2026-05-12 17:26:30
《给阿嬷的情书》破亿,史上“最寒酸”赞助商赢麻了

《给阿嬷的情书》破亿,史上“最寒酸”赞助商赢麻了

首席品牌观察
2026-05-12 14:44:48
起底 Token 中转黑色产业链:日赚 200 万美金!大佬扎堆入局,灰色套利套路碾压现金贷

起底 Token 中转黑色产业链:日赚 200 万美金!大佬扎堆入局,灰色套利套路碾压现金贷

新浪财经
2026-05-12 00:15:49
热闻|曼城3-0横扫水晶宫,与阿森纳积分差距缩小至2分

热闻|曼城3-0横扫水晶宫,与阿森纳积分差距缩小至2分

齐鲁壹点
2026-05-14 06:51:07
2026-05-14 07:40:49
Python学习交流
Python学习交流
人生苦短,我用Python
419文章数 4851关注度
往期回顾 全部

科技要闻

阿里年营收首破万亿,AI终于不再是画大饼

头条要闻

中东战火烧痛印度 莫迪六天访五国要外交“救国”

头条要闻

中东战火烧痛印度 莫迪六天访五国要外交“救国”

体育要闻

14年半,74万,何冰娇没选那条更安稳的路

娱乐要闻

白鹿掉20万粉,网友为李晨鸣不平

财经要闻

美国总统特朗普抵达北京

汽车要闻

C级纯电轿跑 吉利银河"TT"申报图来了

态度原创

本地
家居
旅游
亲子
公开课

本地新闻

用苏绣的方式,打开江西婺源

家居要闻

内在自叙,无域有方

旅游要闻

泰国拟缩短93国游客免签停留期限,从60天减少至30天

亲子要闻

重庆儿童配眼镜,家长指南:儿童防控五大核心问题汇总

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版