Flask多子模块API开发:实现子模块独立运行与整体部署
这是模块化API开发中非常典型的需求,我结合你现有的文件夹结构,给你一套清晰可落地的实现方案:
核心思路:用Flask蓝图(Blueprint)实现模块化拆分与整合
蓝图是Flask专门为模块化设计的特性,既能让每个子模块独立开发、独立运行,又能轻松整合到主应用中,完美匹配你的需求。
第一步:给每个子模块配置独立运行能力
以todo子模块为例,其他模块(比如newsletter)完全照搬这个模式即可:
在子模块中定义蓝图
修改api/todo/__init__.py,创建并导出蓝图:from flask import Blueprint # 创建todo模块的蓝图,第一个参数是蓝图名称,必须唯一 todo_bp = Blueprint('todo', __name__) # 导入当前模块的路由,让蓝图自动注册路由规则 from . import routes编写子模块的路由逻辑
在api/todo/routes.py中添加接口(示例):from . import todo_bp from .utils import get_sample_todos # 可以调用子模块自己的工具类 @todo_bp.route('/list') def get_todo_list(): return {"code": 200, "data": get_sample_todos()}添加子模块的本地启动脚本
在api/todo/下新建run_local.py,作为单独运行该模块的入口:from flask import Flask from . import todo_bp # 创建本地独立运行的Flask实例 app = Flask(__name__) # 注册蓝图,本地运行时可以不加前缀,方便测试 app.register_blueprint(todo_bp, url_prefix='/') if __name__ == '__main__': # 用独立端口启动,避免和其他子模块冲突 app.run(debug=True, port=5001)现在进入
api/todo/目录,执行python run_local.py,就能单独访问todo模块的API了(比如http://localhost:5001/list)。
第二步:主入口整合所有子模块
修改根目录下的api/run.py,把所有子模块的蓝图注册到主应用中,实现完整API的运行:
import sys from pathlib import Path from flask import Flask # 解决导入路径问题:将项目根目录(外层api文件夹)加入Python路径 sys.path.append(str(Path(__file__).parent.parent)) # 导入各个子模块的蓝图 from todo import todo_bp from newsletter import newsletter_bp # 创建主应用实例 app = Flask(__name__) # 注册所有蓝图,统一添加前缀区分不同模块 app.register_blueprint(todo_bp, url_prefix='/todo') app.register_blueprint(newsletter_bp, url_prefix='/newsletter') if __name__ == '__main__': # 生产环境建议关闭debug,改用专业WSGI服务器(比如gunicorn)启动 app.run(debug=False, port=5000)
现在执行python api/run.py,就能访问整合后的API了:
- Todo模块接口:
http://localhost:5000/todo/list - Newsletter模块接口:
http://localhost:5000/newsletter/xxx
第三步:优化导入体验(可选但推荐)
上面的sys.path添加是临时方案,更优雅的方式是把项目安装为可编辑模式:
- 在项目根目录(外层
api/)下新建setup.py,定义项目包信息:from setuptools import setup, find_packages setup( name="my_api", version="0.1", packages=find_packages() ) - 执行
pip install -e .,将项目安装为可编辑模式,之后就可以直接在run.py中导入子模块,不需要手动添加路径了。
额外优化建议
- 公共资源集中管理:把多个子模块共享的工具类、配置项(比如数据库连接、密钥)放到外层
api/目录下(比如api/utils.py、api/config.py),子模块可以通过相对导入调用:from ..utils import xxx - 环境区分:用环境变量区分开发/生产环境,比如开发时加载调试配置,生产时加载正式配置
- 生产部署:不要用
app.run()启动,改用gunicorn或uwsgi等专业WSGI服务器,比如gunicorn run:app --workers=4
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

