¿Por qué Flask empezó a fallar con "ImportError: no se puede importar el nombre 'url_quote' de 'werkzeug.urls'"?

Resuelto Aya Ragab asked hace 1 año • 0 respuestas

Ambiente:

Python 3.10.11
Flask==2.2.2

Ejecuto mi código backend de Flask en un contenedor acoplable, con una imagen BASE: FROM pytorch/pytorch:2.0.1-cuda11.7-cudnn8-runtime

Pero cuando ejecuto pytest con version pytest 7.4.2,

pip install pytest
pytest

generó un error, con registros:

==================================== 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)

Mis códigos funcionan bien cuando los ejecuto directamente conpython run.py

run.pymostrado a continuación

from daat import app

app.run(host='0.0.0.0')

Supongo que debería ser el problema de las versiones de pytest, porque solía funcionar bien sin cambiar ningún código relacionado y lo uso pip install pytestsin definir una versión específica.

Y mi backend funciona bien sin pytest.

Aya Ragab avatar Oct 02 '23 10:10 Aya Ragab
Aceptado

Yo tuve el mismo problema. Se debe a que Werkzeug 3.0.0se lanzó y Flask no especifica la dependencia correctamente (los requisitos dicen Werkzeug>=2.2.0). Por este motivo, Werkzeug 3.0.0todavía está instalado y Flask 2.2.2no está diseñado para Werkzeug 3.0.0.

Solución : Simplemente configure una versión reparada para Werkzeug como Werkzeug==2.2.2la suya requirements.txty debería funcionar.

Scrashdemix avatar Oct 02 '2023 08:10 Scrashdemix

La causa principal de esto es que Werkzeug 3.0.0se eliminó el código previamente obsoleto: https://werkzeug.palletsprojects.com/en/3.0.x/changes/#version-3-0-0

Actualice su versión de Flask, Flask 2.2.2no es compatible: https://github.com/pallets/flask/releases

De todos modos, debe fijar Werkzeug usted mismo y luego, si insiste en usar una versión obsoleta de Flask, o si su código usa url_quotedirectamente, puede cambiar al integrado urllib:

from urllib.parse import quote as url_quote
aude avatar Oct 03 '2023 11:10 aude

Comencé a recibir este error en una actualización que implementé hoy, aunque no estaba intentando importar "url_quote". Flask == 2.0.1. La configuración Werkzeug==2.2.2también funcionó para mí.

Eye Scream avatar Oct 02 '2023 19:10 Eye Scream

Modifique su archivo de requisitos.txt para incluir:

Werkzeug==2.2.xo Werkzeug==2.3.x. O solía Werkzeug==2.2.2estar seguro.

Liam Swayne avatar Oct 20 '2023 02:10 Liam Swayne