为什么 Flask 开始出现“ImportError: cannot import name 'url_quote' from 'werkzeug.urls'”的错误?

101

环境:

Python 3.10.11
Flask==2.2.2

我在Docker容器中运行我的Flask后端代码,使用基础镜像:FROM pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime

但是当我运行版本为pytest 7.4.2的pytest时,出现了问题。

pip install pytest
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 的时候工作得很好。
下面是 run.py 的代码。
from daat import app

app.run(host='0.0.0.0')

我猜应该是pytest版本的问题,因为在没有改变任何相关代码的情况下,它以前运行得很好,而且我使用了pip install pytest而没有指定具体的版本。
而且我的后端在没有pytest的情况下也能正常运行。

已过时。请使用urllib.parse.urlsplit代替。 - undefined
我修改了标题,因为应该立即清楚这是关于Flask安装问题,而不是针对那些试图直接使用Werkzeug API的人。 - undefined
6个回答

156
我遇到了同样的问题。这是因为发布了Werkzeug 3.0.0,而Flask没有正确指定依赖关系(要求中说Werkzeug>=2.2.0)。这就是为什么Werkzeug 3.0.0仍然被安装,而Flask 2.2.2不适用于Werkzeug 3.0.0的原因。 解决方案:只需在requirements.txt中设置一个固定版本的Werkzeug,例如Werkzeug==2.2.2,然后问题应该就解决了。

1
这是我收到的错误信息:冲突的原因是:用户请求的是 Werkzeug==2.2;而 Flask 2.2.2 依赖于 Werkzeug>=2.2.2 - undefined
14
在使用flask==2.1.3时,强制使用Werkzeug==2.3.7似乎解决了我们的问题。根据我们的日志,这是截至上周末pip仍然解析的Werkzeug版本。 - undefined
1
Werkzeug>=2.2,<3.0 应该也可以工作 - undefined
9
我也可以确认,使用flask==2.2.2并添加Werkzeug==2.3.7解决了我们的这个问题。 - undefined
1
对我来说很有效,谢谢! - undefined
显示剩余5条评论

10

这个解决方案对我们来说很有效。前面提到的那个(固定 Werkzeug 版本)也能起作用,但我认为这个是正确的方式。 - undefined

9
我在今天部署的更新中遇到了这个错误,尽管我并没有尝试导入 "url_quote"。设置 Flask == 2.0.1 也对我有用。同时,设置 Werkzeug==2.2.2 也解决了问题。

4
修改您的requirements.txt文件,包含以下内容:
Werkzeug==2.2.x 或 Werkzeug==2.3.x。或者使用 Werkzeug==2.2.2 以确保安全。

看起来和已经发布的许多答案差不多。 - undefined

4
connexion[swagger-ui]<3
flask>=2.0  
Werkzeug>=2.0
gunicorn>=20.0

这个组合对我很有效,最终解决成了这样:
Successfully installed Werkzeug-2.2.3 connexion-2.14.2 flask-2.2.5

Python 3.11/3.12

0
如果您在您的Flask应用程序中遇到"url_quote"函数的问题,很可能是由于错误的导入或者Flask和Werkzeug之间的版本冲突所致。
为了解决这个问题,请按照以下步骤进行操作:
- 更新您的Flask版本
这一步确保您拥有最新的Flask版本:
pip install --upgrade Flask

  • 更新 pytest

在某些情况下,问题可能与 pytest 版本冲突有关。您可以尝试使用以下命令将 pytest 升级到与您的环境兼容的版本:

pip install --upgrade pytest

  • 降级 Werkzeug 版本

如果更新 Flask 并解决软件包冲突无法解决问题,请考虑使用 Werkzeug==2.3.x 版本,注意依赖约束,并在需要时强制使用 Flask==2.1.3 中的 Werkzeug==2.3.7。指定类似 Werkzeug>=2.2,<3.0 的版本范围是一个灵活的选择。使用 Flask==2.2.2 和 Werkzeug==2.3.7 进行测试,并验证 Flask 版本的兼容性。您还可以在 requirements.txt 文件中指定 Werkzeug 版本,例如 Werkzeug==2.3.6。这些步骤应该有助于管理 Flask 应用程序中的版本冲突。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接