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

Flask MVC结构项目如何导入controllers目录下的所有路由

改造方案正确性验证

你目前用Blueprint拆分路由的改造完全正确,既解决了初始版本中controller层无法获取入口app实例导致路由注册失效的问题,也符合Flask模块化开发的规范,没有逻辑问题,可以正常运行。

批量自动注册路由优化方案

你现在的写法需要每新增一个controller就手动在main.py导入对应Blueprint再注册,后续业务多了会比较麻烦,可以用以下方案实现所有controller路由自动注册:

步骤1:完善app/controllers/__init__.py逻辑

添加自动扫描当前目录下所有Blueprint实例的代码:

import os
import importlib
from flask import Blueprint

# 存储所有扫描到的Blueprint实例
all_blueprints = []

# 遍历当前目录下所有文件
for file_name in os.listdir(os.path.dirname(__file__)):
    # 过滤非py文件和自身初始化文件
    if not file_name.endswith(".py") or file_name == "__init__.py":
        continue
    # 导入对应模块
    module_name = f"app.controllers.{file_name[:-3]}"
    controller_module = importlib.import_module(module_name)
    # 提取模块内的Blueprint实例
    for item_name in dir(controller_module):
        item = getattr(controller_module, item_name)
        if isinstance(item, Blueprint):
            all_blueprints.append(item)

步骤2:修改入口main.py实现批量注册

不需要再逐个导入每个controller的Blueprint,直接批量注册即可:

from flask import Flask
from app.controllers import all_blueprints

app = Flask(
    __name__,
    template_folder='app/views',
    static_folder='app/static'
)

# 批量注册所有路由
for bp in all_blueprints:
    # 如果需要给不同业务模块加统一路由前缀,可以在这里添加url_prefix参数,比如:
    # app.register_blueprint(bp, url_prefix=f"/{bp.name}")
    app.register_blueprint(bp)

if __name__ == "__main__":
    app.run(debug=True)

优化方案优势

  • 后续新增controller不需要修改main.py,只要在controllers目录下新建py文件、定义好Blueprint实例就会自动注册
  • 支持灵活配置路由前缀,便于同模块下的路由统一管理
  • 代码结构更简洁,避免重复的导入和注册代码

内容的提问来源于stack exchange,提问作者Alexis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:45:03