人生苦短,我用 Python。 在看到 FastAPI 在首期「OSC 开源软件趋势榜」名列前茅,作为一个 Pythoner,顿时对它产生了浓厚的兴趣,于是立即开始了 FastAPI 体验之旅。
何为 FastAPI ?
FastAPI 是一种现代的、快速(高性能)的 Web 框架,用于构建 API 服务。它使用 Python 3.6+ 开发,用到了 Python 的新特性——标准的 Python 类型提示。
说到快速(高性能),如果要用一个词来形容,个人觉得用“快如闪电”再合适不过,正如它的 logo 中有一道闪电那样!
主要特性概览
FastAPI 主要特性如下:
- 速度快:非常高的性能,可与 NodeJS 和 Golang 相媲美(这要感谢 Starlette 和 Pydantic)。
- 快速编码:将功能开发速度提高约200%至300%。
- 更少的错误:减少开发人员约40%的人为错误。
- 直观:强大的编辑器支持,自动补全无处不在,更少的调试时间。
- 简单:易于学习、易于使用,更少的文档阅读时间。
- 简短:更少的代码重复,每个参数声明有多个功能,更少的 bug。
- 健壮:可用于生产环境的代码。具有自动交互式文档。
- 基于标准:基于(并完全兼容)API 的开放标准:OpenAPI(以前称为 Swagger)和 JSON Schema。
发展快速,社区活跃
FastAPI 创立于2018年12月,距今不到两年。 让我们看一看它的 GitHub 源码相关数据,12.7k Stars、806 Forks、86 releases、114 contributors,可见其关注度比较高,社区也比较活跃,处于快速发展中。
此外,它还有比较完善的官方文档,并且官方文档正被翻译成多种语言,如:西班牙语、葡萄牙语、中文。
快速入门
前提条件
FastAPI 需要 Python 3.6+。
FastAPI 站在巨人的肩膀上:
- Starletter 用于 web 部分。
- Pydantic 用于数据部分。
安装
pip install fastapi
还需要一个 ASGI 服务,这里使用 uvicorn:
pip install uvicorn
示例
创建它
创建一个 main.py
文件:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
return {"item_id": item_id, "q": q}
运行它
uvicorn main:app --reload
检查它
在浏览器中打开链接:http://127.0.0.1:8000/items/5?q=somequery
你将看到 JSON 响应如下:
{"item_id": 5, "q": "somequery"}
交互式文档
浏览器中打开链接:http://127.0.0.1:8000/docs,便可看到自动化的交互式文档,它由 Swagger UI 提供。
他山之石,灵感之源
“他山之石,可以攻玉”,FastAPI 在创建过程中,受到了很多现有工具的启发,并从中汲取了很多灵感,它是当之无愧的集大成者。
下面我们看看有哪些工具在哪些方面给 FastAPI 有所启发:
Django REST Framework
拥有自动化 API 文档 web 用户界面。
Flask
- 成为一个微框架。让混合和匹配所需的工具和零件变简单。
- 拥有一个简单易用的路由系统。
Requests
- 拥有简单直观的 API。
- 直接,直观地使用 HTTP 方法名称(操作)。
- 具有合理的默认值,但有强大的定制功能。
Swagger / OpenAPI
为 API 规范采用开放标准,而不是使用自定义架构。 并集成基于标准的用户界面工具:
- Swagger UI
- Redoc
选择这两个是因为它们相当受欢迎且稳定,但是通过快速搜索,您可以找到数十个 OpenAPI 的其他替代用户界面(可以与 FastAPI 一起使用)。
Marshmallow
使用代码定义 “schemas”,自动的提供数据类型和验证。
Webargs
自动验证传入的请求数据。
APISpec
支持 API 的开放标准 OpenAPI。
Flask-apispec
从与定义序列化和验证的相同的代码自动生成 OpenAPI schema。
NestJS 和 Angular
- 使用 Python 类型具有强大的编辑器支持。
- 拥有强大的依赖注入系统。找到一种减少代码重复的方法。
Sanic
找到拥有高性能的方法。 这就是为什么 FastAPI 基于 Starlette 的原因,因为它是可用的最快的框架(已通过第三方基准测试)。
Falcon
找到获得出色性能的方法。 与 Hug(因为 Hug 基于 Falcon)一起启发了 FastAPI 在函数中声明 response 参数。 尽管在 FastAPI 中它是可选的,它主要用于设置 headers,cookie 和其它状态代码。
Molten
使用模型属性的“默认”值为数据类型定义额外的验证。这改善了编辑器支持,以前这在 Pydantic 中不可用。
这实际上启发了 Pydantic 的更新部分,以支持相同的验证声明样式(所有这些功能现在在 Pydantic 中已经可用)。
Hug
Hug 启发了 APIStar 的各个部分,并且与 APIStar 一样是我发现最有前途的工具之一。
Hug 帮助启发了 FastAPI 使用 Python 类型提示来声明参数,并自动生成定义 API 的 schema。
Hug 启发了 FastAPI 在函数中声明 response 参用于设置 headers 和 cookies。
APIStar(<= 0.5)
使用相同的 Python 类型声明多个内容(数据验证,序列化和文档),同时提供强大的编辑器支持,在我看来这是绝妙想法。
在长时间寻找相似的框架并测试了许多不同的替代方案之后,APIStar 是最佳的选择。
后来,APIStar 不再作为服务器存在,Starlette 被创建了,并且为此类系统提供了新的更好的基础。那是构建 FastAPI 的最终灵感。
作者认为,FastAPI 是 APIStar 的“精神上的继任者”,同时基于对所有这些先前工具的学习,改进并增加功能、类型系统和其他部分。