FastAPI是基于Python类型提示的高性能异步Web框架,支持自动文档、数据校验与依赖注入;需用原生异步库避免阻塞,结合Pydantic模型、JWT认证依赖和Uvicorn部署可构建健壮RESTful API。

FastAPI 是一个现代、快速(高性能)的 Web 框架,基于 Python 类型提示构建,天然支持异步、自动文档(Swagger UI / ReDoc)、数据校验和依赖注入。它特别适合构建 RESTful API,尤其在需要高并发、低延迟的场景中表现突出。
定义清晰的 API 路由与请求模型
FastAPI 的核心优势之一是通过 Python 类型注解自动完成请求参数解析与数据校验。你不需要手动写 if-else 校验字段,只需定义 Pydantic 模型即可。
例如,创建一个用户注册接口:
(实际代码中需导入必要的模块)定义请求体模型:
立即学习“Python免费学习笔记(深入)”;
class UserCreate(BaseModel):
username: str = Field(..., min_length=3, max_length=20)
email: EmailStr
age: Optional[int] = None
定义路由处理函数:
@app.post("/users", response_model=UserOut)
async def create_user(user: UserCreate):
# 异步保存到数据库(如使用 asyncpg 或 TortoiseORM)
db_user = await User.create(**user.dict())
return db_user
FastAPI 会自动:
• 解析 JSON 请求体并转换为 UserCreate 实例
• 校验 username 长度、email 格式、age 类型
• 返回 422 错误并附带详细错误字段信息
真正用好 async/await:避免“假异步”
很多初学者以为只要加了 async def 就是异步,但若调用的是同步阻塞操作(如 requests.get、sqlite3.connect、time.sleep),整个事件循环仍会被卡住。
正确做法:
- 数据库操作:选用原生异步驱动,如 asyncpg(PostgreSQL)、aiomysql(MySQL)、TortoiseORM(支持多种后端)
- HTTP 调用:改用 httpx.AsyncClient 替代 requests
- 文件读写:用 anyio.Path 或 aiopath,或把同步 IO 包裹进 loop.run_in_executor
- 第三方 SDK:优先查是否提供 async 版本(如 aioboto3、aiofiles)
示例:异步调用外部天气 API
async with httpx.AsyncClient() as client:
resp = await client.get(f"https://api.example.com/weather?city={city}")
return resp.json()
依赖注入实战:复用认证、权限与上下文
FastAPI 的依赖系统不是装饰器噱头,而是组织逻辑、解耦职责的关键工具。常见用途包括:
- 身份认证:从 Header 提取 Bearer Token,验证 JWT 并返回当前用户对象
- 权限检查:在依赖中判断 user.role == "admin",不满足则 raise HTTPException(403)
- 数据库连接:每次请求获取一个 asyncpg.Connection,并确保自动关闭
- 请求上下文:记录 request_id、客户端 IP、请求耗时等日志字段
示例:简单 JWT 认证依赖
async def get_current_user(token: str = Depends(oauth2_scheme)) -> User:
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
user_id: str = payload.get("sub")
if not user_id:
raise credentials_exception
return await User.get(id=user_id)
except JWTError:
raise credentials_exception
之后在任意路由中直接声明依赖:
def read_profile(current_user: User = Depends(get_current_user)):
调试与生产就绪小贴士
开发阶段可开启 debug=True 自动重载;但上线前务必关闭,并配置反向代理(Nginx)处理静态文件、HTTPS 终止与负载均衡。
关键建议:
- 用 Uvicorn 启动(支持多进程 + event loop),不要用默认 run() —— 生产环境推荐:
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4 --reload - 统一异常处理器:捕获自定义业务异常(如 UserNotFound)、数据库唯一约束错误,返回结构化 JSON
- 添加中间件记录请求耗时、trace_id,便于排查慢接口
- 用 pydantic.BaseSettings 管理环境变量(DEBUG、DATABASE_URL、JWT_SECRET)
FastAPI 不是“更快的 Flask”,而是一套以类型安全和异步原生为设计前提的新范式。写对模型、用对异步、理清依赖,API 就自然健壮、可测、易维护。










