【FastAPI 技术总结】现代 Python API 开发实践
一、概述
FastAPI 是一个基于 Python 类型提示构建的现代 Web 框架,专为开发高性能 API 而设计。它底层依赖 Starlette(负责 Web 路由与异步处理)和 Pydantic(负责数据校验与序列化),将两者能力结合,形成了"类型即契约"的开发范式。
其核心价值在于:用一份类型声明,同时获得数据校验、自动文档和编辑器智能提示,显著减少样板代码。
二、核心特性
|
特性 |
说明 |
|
高性能 |
基于 ASGI 和异步 I/O,性能接近 NodeJS、Go |
|
类型安全 |
利用 Python 类型提示自动校验请求数据 |
|
自动文档 |
自动生成 Swagger UI ( |
|
异步支持 |
原生支持 |
|
依赖注入 |
内置强大的依赖注入系统,便于复用逻辑 |
|
标准化 |
遵循 OpenAPI 和 JSON Schema 规范 |
三、快速上手
安装与运行
pip install "fastapi[standard]" uvicorn main:app --reload
最小示例
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 = None):
return {"item_id": item_id, "q": q}
启动后访问 http://127.0.0.1:8000/docs 即可看到交互式文档。
四、核心技术要点
1. 参数处理
FastAPI 通过函数签名自动区分参数类型:
- 路径参数:出现在路径
{}中,如/items/{item_id} - 查询参数:未出现在路径中的参数,如
?skip=0&limit=10 - 请求体:由 Pydantic 模型定义,自动解析 JSON
@app.get("/users/{user_id}/items/{item_id}")
def get_user_item(user_id: int, item_id: str, q: str | None = None, short: bool = False):
return {"user_id": user_id, "item_id": item_id, "q": q, "short": short}
2. Pydantic 数据校验
from pydantic import BaseModel
class Item(BaseModel):
name: str
price: float
is_offer: bool = False
@app.post("/items/")
def create_item(item: Item):
return {"name": item.name, "total": item.price}
Pydantic 自动完成类型转换、字段校验,校验失败时返回清晰的 422 错误。
3. 依赖注入
依赖注入用于复用逻辑(数据库连接、认证、分页等):
from fastapi import Depends
def common_params(q: str | None = None, skip: int = 0, limit: int = 10):
return {"q": q, "skip": skip, "limit": limit}
@app.get("/products/")
def list_products(params: dict = Depends(common_params)):
return params
4. 异步与同步的选择
-
async def:在事件循环中运行,适合 I/O 密集操作 -
def:在线程池中运行,适合 CPU 密集或同步阻塞操作
@app.get("/async-items/")
async def get_async_items():
data = await fetch_from_db()
return data
5. 项目结构
推荐使用 APIRouter 拆分路由,保持项目可维护:
app/ ├── main.py ├── routers/ │ ├── users.py │ └── items.py ├── models/ ├── schemas/ ├── dependencies.py └── database.py
from fastapi import APIRouter
router = APIRouter(prefix="/users", tags=["users"])
@router.get("/")
def list_users():
return []
# main.py from app.routers import users app.include_router(users.router)
五、生产部署
# 开发环境 uvicorn main:app --reload # 生产环境(Gunicorn + Uvicorn Worker) gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker
六、学习路径建议
- 基础阶段:通读官方 Tutorial,掌握路由、参数、Pydantic 模型
- 进阶阶段:深入依赖注入、安全认证(OAuth2/JWT)、响应模型
- 实战阶段:结合 SQLAlchemy 或异步数据库驱动,完成一个完整项目
- 权威资源:
- 官方文档:
https://fastapi.tiangolo.com/ - 中文文档:
https://fastapi.tiangolo.com/zh/
七、总结
FastAPI 的核心竞争力在于将 Python 类型系统转化为开发效率。它用类型提示统一了数据校验、文档生成和 IDE 支持,让开发者能够以更少的代码构建更健壮、更易维护的 API。对于新项目而言,FastAPI 是当前 Python Web 开发中值得优先考虑的选择。


浙公网安备 33010602011771号