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
相关产品推荐
相关产品推荐

