当单文件应用开始变大,把 APIRouter、include_router、多文件结构和 lifespan 放到同一条工程化路径里看。
FastAPI 的前面几章都还能在一个文件里完成,但一旦路由、依赖和安全逻辑变多,问题就会从"会不会写"变成"怎么组织"。
1. APIRouter 解决的不是功能,而是组织
APIRouter 不是另一个小型 FastAPI,它更像"可组合的路由组"。
官方 Bigger Applications 页里最值得留下来的直觉是:
- 应用不是只有一个
app - 路由可以先在各自模块里组织好
- 最后再由主应用统一挂载
2. 最常见的多文件结构
这类结构是最典型的起点:
app/├── __init__.py├── main.py├── dependencies.py└── routers/ ├── __init__.py ├── items.py └── users.py这里的分层已经很清楚:
main.py:组装应用routers/:各业务路由dependencies.py:共享依赖
3. 在路由模块里定义 APIRouter
Python3
点击展开代码
展开代码
这一层最重要的点是:
prefixtagsdependenciesresponses
都可以直接挂在 APIRouter 上,而不用在每个路径操作里重复写。
4. 在主应用里 include_router
Python3
点击展开代码
展开代码
官方文档里这段很有代表性,因为它说明:
- 路由模块本身可以保持通用
- 应用层再决定怎么挂载它
include_router()时还能继续补prefix、tags、dependencies、responses
来源:Bigger Applications 官方页 https://fastapi.tiangolo.com/zh/tutorial/bigger-applications/
5. 这样组织的真正好处
这不是为了"目录看起来整齐",而是为了几件更实在的事:
- 共享路由模块更容易
- 共享依赖逻辑更自然
- 主应用装配时灵活度更高
/docs里的标签分组也更清楚
6. lifespan:把应用级初始化和清理写成一对
如果有些资源应该在应用启动时加载、关闭时释放,FastAPI 现在更推荐用 lifespan。
Python3
点击展开代码
展开代码
官方文档明确写到:
yield之前在应用启动前执行yield之后在应用结束时清理
来源:Lifespan 官方页 https://fastapi.tiangolo.com/zh/advanced/events/
7. lifespan 和依赖里的 yield 有什么不同
它们都用到了 yield,但层级不一样:
- 依赖里的
yield:围绕一次请求 lifespan:围绕整个应用生命周期
所以适合放在 lifespan 里的,通常是:
- 模型预加载
- 全局连接池初始化
- 应用级缓存
而数据库 session 这种更短命的资源,还是更适合放依赖里。
专题阅读
PythonWeb
这篇文章属于同一条阅读链。你可以直接在这里切换,不用再回到列表页重新找。
部分信息可能已经过时
留言区
留言
欢迎纠错、补充、交流。昵称和评论内容必填;如果你愿意,也可以留下联系方式,仅站主可见。