升级Connexion等依赖后SwaggerHub生成代码报错:找不到flask_app模块
升级connexion(2.14.2→3.0.6)、flask(2.2.5→3.0.3)和werkzeug(2.2.3→3.0.2)及所有相关依赖库后,SwaggerHub生成的Flask服务端代码桩无法适配新版本,出现以下错误:
2024-04-16 14:13:22,701 [MainThread ] ERROR root - Failed with exception: No module named 'connexion.apps.flask_app'
Traceback (most recent call last):
File "neoctl\src\main\main.py", line 523, in main
File "neoctl\src\main\main.py", line 191, in init
File "neoctl\src\modules\restserver\run.py", line 5, in <module>
File "neoctl\src\generated\server\swagger_server\encoder.py", line 1, in <module>
ModuleNotFoundError: No module named 'connexion.apps.flask_app'
经确认,connexion.apps.flask_app模块在Connexion 3.x版本中已重命名为connexion.apps.flask,可通过以下步骤恢复代码正常运行:
解决方案
1. 修改生成代码的导入路径
找到生成代码中所有引用connexion.apps.flask_app的文件(比如报错中的encoder.py),将原有导入语句:
from connexion.apps.flask_app import FlaskJSONEncoder
替换为:
from connexion.apps.flask import FlaskJSONEncoder
2. 全面检查并替换旧模块引用
除encoder.py外,还需检查生成的服务端代码其他文件(如run.py、__init__.py等),只要存在connexion.apps.flask_app的引用,全部替换为connexion.apps.flask。
3. 调整SwaggerHub生成配置(长期方案)
若后续需要重新生成代码,在SwaggerHub的代码生成设置中:
- 选择适配Connexion 3.x的代码模板;若默认Python-Flask模板未更新,可手动指定兼容3.x的模板版本,或反馈给SwaggerHub官方更新模板,使其支持新的导入路径。
4. 确认依赖版本匹配
在项目的requirements.txt中明确指定兼容的依赖版本:
connexion==3.0.6 flask==3.0.3 werkzeug==3.0.2
执行以下命令重新安装依赖:
pip install -r requirements.txt
内容的提问来源于stack exchange,提问作者Michael Sanders

