快、类型安全、自带文档。如果你还在用 Flask 手写参数校验,是时候认识一下 FastAPI 了。
一、FastAPI 是什么
FastAPI 是一个基于 Python 类型提示(Type Hints)构建的现代 Web 框架,底层使用 Starlette(ASGI 框架)处理网络与路由,使用 Pydantic 处理数据校验与序列化。
它最核心的三个卖点:
- 快:性能接近 Node.js 与 Go,是同期 Flask 的数倍(主要得益于异步与 Pydantic v2 的 Rust 内核)
- 少写代码:类型提示即校验规则,一处声明多处生效
- 自带交互文档:启动后自动生成 Swagger UI 与 ReDoc,无需手写 API 文档
二、快速上手
安装
pip install "fastapi[standard]"第一个应用
创建 main.py:
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def read_root():
return {"message": "Hello, FastAPI!"}运行
fastapi dev main.py
# 或者使用 uvicorn
uvicorn main:app --reload打开 http://127.0.0.1:8000/docs ,你会看到一个完整的交互式 API 文档——这一切都是自动生成的,你一行文档都没写。
三、核心特性
1. 路径参数与查询参数
类型提示直接决定了解析与校验行为:
from fastapi import FastAPI
app = FastAPI()
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str | None = None):
return {"item_id": item_id, "q": q}访问 /items/abc 会直接返回 422 错误,并明确指出 item_id 不是整数——不需要写任何校验代码。
2. 请求体与 Pydantic 模型
from pydantic import BaseModel, Field
class Item(BaseModel):
name: str = Field(..., max_length=100)
price: float = Field(..., gt=0)
tags: list[str] = []
@app.post("/items/")
async def create_item(item: Item):
return {"name": item.name, "total": item.price * 1.13}请求体自动解析、自动校验、自动序列化,并且这些规则会同步出现在文档里。
3. 依赖注入(Dependency Injection)
FastAPI 的依赖注入系统是它最优雅的设计之一,尤其适合处理数据库连接、鉴权、公共参数:
from fastapi import Depends, FastAPI, Header, HTTPException
app = FastAPI()
def verify_token(x_token: str = Header(...)):
if x_token != "secret":
raise HTTPException(status_code=401, detail="Invalid token")
@app.get("/protected", dependencies=[Depends(verify_token)])
async def protected():
return {"ok": True}用 yield 还能优雅地管理资源生命周期:
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()依赖可以嵌套、可以缓存、可以被覆盖——测试时替换数据库尤其方便。
4. 原生异步支持
import httpx
from fastapi import FastAPI
app = FastAPI()
@app.get("/proxy")
async def proxy():
async with httpx.AsyncClient() as client:
resp = await client.get("https://api.example.com/data")
return resp.json()同步函数也没问题,FastAPI 会自动把它放到线程池里执行,不会阻塞事件循环。
5. 自动文档
| 路径 | 说明 |
|---|---|
/docs |
Swagger UI,可直接调试接口 |
/redoc |
ReDoc,更适合阅读 |
/openapi.json |
OpenAPI 3.1 Schema,可导入 Postman / 生成客户端 SDK |
四、与 Flask / Django 的对比
| 维度 | FastAPI | Flask | Django |
|---|---|---|---|
| 异步支持 | 原生 async/await | 有限(需扩展) | 部分支持 |
| 数据校验 | Pydantic 内置 | 需手动或扩展 | Form / DRF Serializer |
| 自动文档 | 内置 | 需插件 | 需 DRF + drf-spectacular |
| 学习曲线 | 低 | 很低 | 中高 |
| 适用场景 | API / 微服务 | 小型服务 | 全栈重型项目 |
一句话总结:写 API 用 FastAPI,写全栈管理系统用 Django,写玩具用 Flask。
五、生产部署
最简单的组合是 Gunicorn + Uvicorn Worker:
gunicorn main:app \
-k uvicorn.workers.UvicornWorker \
-w 4 \
-b 0.0.0.0:8000Docker 示例:
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]部署前别忘了:
- 关闭
--reload - 用环境变量管理配置(推荐
pydantic-settings) - 配置反向代理(Nginx / Traefik)处理 TLS
- 加上结构化日志与健康检查接口
六、小结
FastAPI 的核心哲学是 "声明即实现":你用类型提示声明数据长什么样,框架就替你把解析、校验、序列化和文档全做完。它把 Python 3.6+ 的类型系统从"给 IDE 看的注释"变成了"可执行的契约"。
如果你正准备写一个新的 API 服务,FastAPI 大概率是当下最省心的选择。
参考资源
- 官方文档:https://fastapi.tiangolo.com/
- Pydantic:https://docs.pydantic.dev/
- Starlette:https://www.starlette.io/
❤️ 转载文章请注明出处,谢谢!❤️