ImportError: cannot import name 'url_quote' from 'werkzeug.urls'

回答 3 浏览 1.2万 2023-10-02

环境:

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 的情况下运行良好。

stevezkw 提问于2023-10-02
我最终通过指定我的 Werkzeug==2.3.7 解决了这个问题,感谢大家提供良好的信号stevezkw 2023-10-02
3 个回答
#1楼 已采纳
得票数 56

我有同样的问题。这是因为 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,它就应该可以工作。

Scrashdemix 提问于2023-10-02
Mickey Kim 修改于2023-10-02
但我相信应该是Werkzeug==2.2.2IanS 2023-10-02
@IanS我不认为依赖版本设置得如此严格。他们要么不发布 Werkzeug 2.2 的更新,要么只发布错误修复。但是,是的,你可以做到真正安全。Scrashdemix 2023-10-02
这是我得到的错误:The conflict is caused by: The user requested Werkzeug==2.2; flask 2.2.2 depends on Werkzeug>=2.2.2IanS 2023-10-02
当使用flask==2.1.3时,似乎强制Werkzeug==2.3.7为我们解决了这个问题。根据我们的日志,截至上周末,pip 仍已解决了 Werkzeug 的版本。Svend 2023-10-02
还可以确认使用flask==2.2.2并添加Werkzeug==2.3.7为我们解决了这个问题dem 2023-10-03
#2楼
得票数 6

尽管我没有尝试导入 url_quote,但我在今天部署的更新中开始收到此错误。Flask == 2.0.1。设置 Werkzeug==2.2.2 也对我有用。

Eye Scream 提问于2023-10-02
#3楼
得票数 2

其根本原因是 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 那么你可以切换到内置的 urllib,你需要自己固定 Werkzeug:

from urllib.parse import quote as url_quote
aude 提问于2023-10-03
这个解决方案对我们有用。前面提到的一种(固定 Werkzeug 版本)也可以正常工作,但恕我直言,这是正确的方法。jvleminc 2023-10-04