You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 00:45:04