章节摘要:本章把 API 从"能跑"推向"能上线"的三块拼图补齐:安全上,用 OAuth2 密码流加 JWT 搭出无状态认证,用依赖链实现分级授权;任务上,区分"响应后顺手做"的 BackgroundTasks 与"跨进程可靠执行"的 Celery,给出选择边界;测试上,以 TestClient 与 pytest 为骨架搭测试分层,用依赖覆盖隔离外部资源。
阅读完本章,你应当能够:
一句金句:认证回答"你是谁",授权回答"你能做什么";后台任务回答"这件事值得让用户等吗";测试回答"你敢在周五下午发版吗"。
从依赖注入视角重看安全:verify_token、get_current_user、get_admin_user 逐层递进的权限链,OAuth2PasswordBearer 的文档协同价值,JWT 的签发、校验、过期与撤销难题,以及 API Key 与 HTTP Basic 两种轻量方案的适用面。
同进程的后台执行与跨进程的任务队列是两种不同量级的工具。本节给出选择判据(可靠性要求、耗时、结果追踪)、BackgroundTasks 的时序细节(响应已发出后执行、异常去哪了)与 Celery 场景下的架构位置。
TestClient 的免端口特性、pytest 夹具管理应用与数据、依赖覆盖隔离数据库与外部服务、认证接口的测试捷径(直接覆盖 get_current_user),以及覆盖率之外更值得写的三类测试。
三节共享同一个底座——第 3 章的依赖注入:
5.1 安全(依赖链的最高级应用) │ ▼ 5.2 后台任务(响应生命周期的延伸) │ ▼ 5.3 测试(用依赖覆盖验证前两者)
安全链就是依赖嵌套的教科书案例;后台任务牵涉响应返回后的执行时序;测试则依赖 dependency_overrides 把前两者与真实资源解耦。学完本章回头看第 3 章,会对"依赖是 FastAPI 的组织中枢"有体感。
三节都配有可直接运行的代码骨架,但安全与测试是最不该"看懂就算"的两块:认证代码抄错一个字段就是数据泄漏,测试写歪一层就是虚假安全感。建议跟着 5.1 手写完整的签发校验链(不用框架外的魔法库),跟着 5.3 给自己手头的接口补三个测试再往下读。
三节之间的知识互检也值得做一遍:用 5.3 的依赖覆盖去测 5.1 的权限链(普通用户访问管理员接口应得 403——正文里那个测试的原型);用 5.2 的判据去审视 5.1 里"签发令牌后要不要发通知邮件"这类交叉需求(发通知走 BackgroundTasks,别塞进认证流程)。当三块知识能互相引用时,它们才从三个主题变成一个体系。
安全、任务、测试也是三个"过度工程"的重灾区:给内部工具上全套 OAuth2 加 scope、给发一封邮件引入整套 Celery、给两周寿命的原型追求覆盖率数字——都是真实见过的弯路。本章每节末尾的反面清单不是装饰,是三道刹车。判断的锚点始终回到第 1 章的选型思维:技术的引入要对得上问题的量级,内部工具的 API Key、进程内的轻后台、关键路径上的三个测试,都是"匹配"的好答案。
章末建议做一次三合一整合:给 5.1 的认证骨架写 5.3 形态的测试组(登录成功、错误密码 401、无令牌访问 401、过期令牌 401),再给注册后发送欢迎邮件加上 BackgroundTasks 并写出对应测试(验证任务被调度、覆盖任务实现避免真发信)。一个小练习穿过三节机制——认证的依赖链、任务的生命周期、测试的依赖覆盖在同一个项目里各就各位。做完这个练习,你就拥有了可以写进简历片段的生产三件套实操记录,也为第 6 章的数据库集成准备好了被测对象。
安全、任务、测试三块拼图就位后,你的服务第一次具备了"生产尊严":访问有身份、耗时有着落、改动有保障。三块拼图的共同底座是第 3 章的依赖注入——这不是巧合,而是现代框架设计的缩影:横切能力(谁在调用、资源从哪来、如何替换)统一由一套机制承载,学会一次,处处受益。下一章把这台"有尊严的服务"接到真实世界:数据库给它记忆、文档给它说明书、静态资源给它门面——集成章是前三章机制的大型应用现场。
再补一个跨章检查点:本章完成后,你的项目应当能通过一次"深夜演练"——模拟一次真实事故响应:随机挑一个接口,用测试复现一个注入的 bug(改错一处逻辑),看测试是否变红;模拟一次令牌泄漏(作废版本号),看旧令牌是否全数失效;模拟一次任务失败(拔掉邮件服务的假实现),看补偿扫描是否接管。三个演练通过,生产三件套就不是"写了",而是"在了"——写过的机制与在起作用的机制,隔着的正是这类演练的距离。