FastAPI 详解:现代高性能 Python API 框架
- FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API。它基于 Python 3.8+ 标准类型提示(Type Hints),由 Sebastián Ramírez 开发。
它是目前 Python 生态中最受欢迎的框架之一,特别是在数据科学、机器学习服务和微服务领域,正在迅速取代 Flask 和部分 Django 的使用场景。
一、核心优势(为什么要用 FastAPI?)
-
高性能 (Fast):基于 Starlette(负责路由和 Web 部分)和 Pydantic(负责数据验证)。其性能与 NodeJS 和 Go 相当,是 Python 框架中速度最快的之一。
-
开发效率极高:基于 Python 类型提示,编辑器可以提供极佳的代码补全和错误检查,减少约 40% 的人为错误。
-
自动生成文档 :无需编写额外配置,框架会自动根据代码生成交互式 API 文档
1.Swagger UI(默认地址/docs)
2.ReDoc(默认地址/redoc) -
数据验证与序列化:自动处理 JSON 请求体、查询参数的解析和验证。如果数据格式错误,会自动返回清晰的报错信息。
-
原生支持异步 (Async) :完美支持 Python 的
async和await,适合高并发场景。 -
依赖注入 (Dependency Injection):拥有一个强大且易用的依赖注入系统,方便管理数据库连接、认证逻辑等。
二、快速入门
1. 安装
- 需要安装 FastAPI 和一个 ASGI 服务器(通常使用 Uvicorn)。
bash
pip install fastapi uvicorn
2. 编写代码(main.py)
python
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
# 定义数据模型 (Pydantic)
class Item(BaseModel):
name: str
price: float
is_offer: Union[bool, None] = None
# 1. 基本 GET 请求
@app.get("/")
def read_root():
return {"Hello": "World"}
# 2. 带路径参数和查询参数的 GET 请求
# 访问示例: /items/5?q=somequery
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
# item_id 会自动转换为 int,如果不符合会报错
return {"item_id": item_id, "q": q}
# 3. 带请求体 (JSON) 的 POST 请求
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id, "price": item.price}
3. 运行服务
- 在终端中运行:
bash
uvicorn main:app --reload
参数说明:
-
main: 文件名main.py -
app: 代码中app = FastAPI()的变量名 -
--reload: 代码修改后自动重启服务器(开发模式推荐)
4. 查看结果
-
访问
http://127.0.0.1:8000/items/5?q=test,可看到 JSON 响应。 -
访问
http://127.0.0.1:8000/docs,可打开自动生成的 Swagger UI,直接在网页上测试接口。
三、核心概念解析
1. Pydantic(数据验证)
FastAPI 强烈依赖 Pydantic。定义一个继承自 BaseModel 的类,FastAPI 会自动完成:
-
解析:将 JSON 转换为 Python 对象。
-
验证 :确保字段类型正确(比如
price必须是float)。 -
过滤:自动忽略未定义的额外字段。
2. 异步(Async/Await)
- 如果代码中有 IO 操作(如读写数据库、请求第三方 API),可以使用
async定义路由:
python
@app.get("/users/")
async def read_users():
results = await some_async_database_query()
return results
- FastAPI 会自动在事件循环中处理异步逻辑。
3. 依赖注入(Depends)
- 这是 FastAPI 最优雅的设计之一,用于提取通用逻辑,例如获取数据库会话或验证用户 Token。
python
from fastapi import Depends, FastAPI
def common_parameters(q: str | None = None, skip: int = 0, limit: int = 100):
return {"q": q, "skip": skip, "limit": limit}
@app.get("/items/")
def read_items(commons: dict = Depends(common_parameters)):
return commons
四、FastAPI vs Flask vs Django
| 特性 | FastAPI | Flask | Django |
|---|---|---|---|
| 定位 | 现代高性能 API 框架 | 轻量级微框架 | 全栈重量级框架 |
| 性能 | 极高 (ASGI) | 一般 (WSGI) | 一般 (WSGI) |
| 异步支持 | 原生优秀 | 后期添加 (2.0+) | 后期添加 (3.0+) |
| 数据验证 | 内置 (Pydantic) | 需插件 (如 Marshmallow) | 内置 (Forms/Serializers) |
| 文档生成 | 自动 (Swagger/ReDoc) | 需插件 | 需插件 (DRF + Swagger) |
| 学习曲线 | 中等 (需懂 Python 类型提示) | 简单 | 陡峭 |
| 适用场景 | 高并发 API、ML 模型服务、微服务 | 简单应用、快速原型 | 传统 CMS、大型单体应用 |
五、什么时候选择 FastAPI?
-
需要构建 RESTful API(前后端分离)。
-
非常看重 执行速度 和 开发速度。
-
喜欢 Python 的 Type Hints(类型提示)。
-
需要 自动生成文档 给前端或第三方使用。
-
需要部署 机器学习模型(TensorFlow/PyTorch 等通常需要高性能 API 包装)。
总结
- FastAPI 是目前 Python Web 开发的新标准。虽然 Django 依然在全栈开发中占据主导地位,Flask 依然适合极简任务,但如果主要是做 API 开发,FastAPI 通常是最好的选择。