为什么 Flask 开始失败并显示“ImportError:无法从 'werkzeug.urls' 导入名称 'url_quote'”?

问题描述 投票:0回答:6

环境:

Python 3.10.11
Flask==2.2.2

我在 docker 容器中使用 BASE Image 运行 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 的情况下运行良好。

python flask pytest werkzeug
6个回答
146
投票

我也有同样的问题。这是因为

Werkzeug 3.0.0
已发布,而 Flask 没有正确指定依赖项(需求显示
Werkzeug>=2.2.0
)。这就是为什么
Werkzeug 3.0.0
仍然安装,而
Flask 2.2.2
不是为
Werkzeug 3.0.0
制作的。

解决方案:只需在您的

Werkzeug==2.2.2
中设置Werkzeug的修复版本,例如
requirements.txt
,它就应该可以工作。


10
投票

其根本原因是

Werkzeug 3.0.0
删除了之前已弃用的代码:https://werkzeug.palletsprojects.com/en/3.0.x/changes/#version-3-0-0

请更新您的 Flask 版本,

Flask 2.2.2
不支持:https://github.com/pallets/flask/releases

无论如何,如果你坚持使用过时版本的

Flask
,或者你的代码直接使用
url_quote
,那么你需要自己固定Werkzeug,那么你可以切换到内置的
urllib

from urllib.parse import quote as url_quote

8
投票

我在今天部署的更新中开始收到此错误,即使我没有尝试导入“url_quote”。

Flask == 2.0.1
。 设置
Werkzeug==2.2.2
也对我有用。


3
投票
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


2
投票

修改您的requirements.txt以包括:

Werkzeug==2.2.x
Werkzeug==2.3.x
。或者使用
Werkzeug==2.2.2
来确保安全。


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
,注意依赖性约束,并在需要时使用
Werkzeug==2.3.7
强制使用
Flask==2.1.3
。指定像
Werkzeug>=2.2,<3.0
这样的 Werkzeug 版本范围是一个适应性选项。使用
Flask==2.2.2
Werkzeug==2.3.7
进行测试并验证
Flask
版本兼容性。您还可以在
Werkzeug
文件中指定
requirements.txt
版本,例如
Werkzeug==2.3.6
。这些步骤应该有助于管理您的
Flask
应用程序中的版本冲突。

© www.soinside.com 2019 - 2024. All rights reserved.