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

ste*_*zkw 146 python werkzeug pytest flask

环境:

Python 3.10.11
Flask==2.2.2
Run Code Online (Sandbox Code Playgroud)

我在 docker 容器中使用 BASE Image 运行 Flask 后端代码: FROM pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime

但是当我使用 version 运行 pytest 时pytest 7.4.2

pip install pytest
pytest
Run Code Online (Sandbox Code Playgroud)

它引发了一个错误,日志如下:

==================================== 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)
Run Code Online (Sandbox Code Playgroud)

当我直接运行它时,我的代码运行良好python run.py

run.py如下所示

from daat import app

app.run(host='0.0.0.0')
Run Code Online (Sandbox Code Playgroud)

我想这应该是 pytest 版本问题,因为它曾经在不更改任何相关代码的情况下运行良好,并且我pip install pytest在没有定义特定版本的情况下使用。

我的后端在没有 pytest 的情况下运行良好。

小智 239

我有同样的问题。这是因为Werkzeug 3.0.0发布后 Flask 没有正确指定依赖项(需求说Werkzeug>=2.2.0)。这就是为什么,Werkzeug 3.0.0仍然安装并且Flask 2.2.2不是为Werkzeug 3.0.0.

解决方案:只需为 Werkzeug 设置一个修复版本(例如Werkzeug==2.2.2您的版本)requirements.txt,它就应该可以工作。

  • 当使用 `flask==2.1.3` 时,似乎强制 `Werkzeug==2.3.7` 为我们解决了这个问题。根据我们的日志,截至上周末,该版本的“Werkzeug”仍由“pip”解决。 (14认同)
  • 还可以确认使用 `flask==2.2.2` 并添加 `Werkzeug==2.3.7` 为我们解决了这个问题 (11认同)

aud*_*ude 18

其根本原因是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
Run Code Online (Sandbox Code Playgroud)


小智 10

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


小智 6

修改您的requirements.txt以包括:

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


Gen*_*kin 5

connexion[swagger-ui]<3
flask>=2.0  
Werkzeug>=2.0
gunicorn>=20.0
Run Code Online (Sandbox Code Playgroud)

这种组合对我有用并解决了这个问题:

Successfully installed Werkzeug-2.2.3 connexion-2.14.2 flask-2.2.5
Run Code Online (Sandbox Code Playgroud)

Python 3.11/3.12