FastAPI如何从独立文件导入routers 无需在主文件逐个写app.include_router()
FastAPI 统一批量导入路由实现方案
该需求完全可以实现,核心思路是通过Python动态导入能力,将所有路由的扫描、注册逻辑抽离到独立文件中,主文件仅需一次调用即可完成全部路由注册。
1. 标准项目目录结构参考
your_fastapi_project/ ├── main.py # FastAPI 应用主入口 ├── routers/ # 所有业务路由的存放目录 │ ├── __init__.py │ ├── user.py # 用户模块路由 │ ├── order.py # 订单模块路由 │ └── product.py # 商品模块路由 └── router_loader.py # 独立的路由批量加载逻辑文件
2. 编写独立路由加载逻辑
在router_loader.py中实现路由自动扫描、收集逻辑,示例代码如下:
import os import importlib from fastapi import APIRouter def get_all_routers(router_dir: str = "routers") -> list[APIRouter]: routers = [] # 获取路由目录的绝对路径 router_path = os.path.join(os.path.dirname(__file__), router_dir) for filename in os.listdir(router_path): # 排除非Python文件、__init__.py文件 if not filename.endswith(".py") or filename == "__init__.py": continue # 去掉文件后缀得到模块名 module_name = filename[:-3] # 动态导入路由模块 module = importlib.import_module(f"{router_dir}.{module_name}") # 提取模块中的router实例(约定每个路由文件的路由实例统一命名为router) if hasattr(module, "router") and isinstance(module.router, APIRouter): # 可选:自动给当前模块路由加统一前缀,前缀和模块名保持一致 # module.router.prefix = f"/api/{module_name}" routers.append(module.router) return routers
3. 主文件单次注册全部路由
在main.py中仅需调用一次加载逻辑即可完成全部路由注册,后续新增路由无需修改主文件:
from fastapi import FastAPI from router_loader import get_all_routers app = FastAPI() # 批量注册所有路由 for router in get_all_routers(): app.include_router(router) if __name__ == "__main__": import uvicorn uvicorn.run(app)
注意事项
- 约定每个业务路由文件中的
APIRouter实例统一命名为router,避免动态加载时识别失败 - 如果存在多层嵌套的路由子目录,可以在加载逻辑中新增递归遍历规则,适配多级目录结构
- 不需要加载的路由文件可以在扫描逻辑中增加过滤规则,比如文件名以
_开头的文件自动跳过
内容的提问来源于stack exchange,提问作者Adithya Samavedhi
相关产品推荐
相关产品推荐

