Flask执行pytest时触发ImportError:无法从werkzeug.urls导入url_quote
Flask2.2.2运行pytest时出现
ImportError: cannot import name 'url_quote' from 'werkzeug.urls' 环境信息
Python 3.10.11 Flask==2.2.2
基于pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime镜像在Docker中运行Flask后端。未指定版本安装pytest(自动安装了7.4.2)后,执行pytest时出现导入错误,日志如下:
==================================== ERRORS ==================================== _____________ ERROR collecting tests/test_fiftyone_utils_utils.py ______________ ImportError while importing test module '/builds/kw/data-auto-analysis-toolkit-backend/tests/test_fiftyone_utils_utils.py'. Hint: make sure your test modules/packages have valid Python names. Traceback: /opt/conda/lib/python3.10/importlib/__init__.py:126: in import_module return _bootstrap._gcd_import(name[level:], package, level) tests/test_fiftyone_utils_utils.py:2: in <module> import daat # noqa: F401 /opt/conda/lib/python3.10/site-packages/daat-1.0.0-py3.10.egg/daat/__init__.py:1: in <module> from daat.app import app /opt/conda/lib/python3.10/site-packages/daat-1.0.0-py3.10.egg/daat/app/__init__.py:6: in <module> from flask import Flask, jsonify, request /opt/conda/lib/python3.10/site-packages/flask/__init__.py:5: in <module> from .app import Flask as Flask /opt/conda/lib/python3.10/site-packages/flask/app.py:30: in <module> from werkzeug.urls import url_quote E ImportError: cannot import name 'url_quote' from 'werkzeug.urls' (/opt/conda/lib/python3.10/site-packages/werkzeug/urls.py)
但直接执行python run.py(代码如下)时后端运行正常:
from daat import app app.run(host='0.0.0.0')
问题原因
本质是依赖版本冲突:Flask2.2.2依赖的Werkzeug版本范围是>=2.2.2,但Werkzeug从2.3.0版本开始移除了url_quote这个API(改用url_quote_plus或其他替代方法)。安装pytest7.4.2时,pip的依赖解析自动升级了Werkzeug到不兼容的版本,导致Flask导入失败。而之前直接运行后端正常,是因为当时环境里的Werkzeug版本还在Flask2.2.2兼容的范围内。
解决方案
方案一:固定Werkzeug版本到兼容范围
执行命令降级Werkzeug:
pip install werkzeug<=2.2.3
之后重新运行pytest即可。
方案二:升级Flask到兼容新版本Werkzeug的版本
Flask2.3.0及以上版本已经适配了Werkzeug2.3+的API变化,执行升级命令:
pip install flask>=2.3.0
方案三:指定pytest版本安装,避免依赖升级
如果不想改动Flask或Werkzeug版本,可以安装一个不会触发Werkzeug升级的pytest版本,比如7.3.0:
pip install pytest==7.3.0
内容的提问来源于stack exchange,提问作者stevezkw
相关产品推荐
相关产品推荐

