ImportError:无法从“werkzeug.security”导入名称“safe_str_cmp”

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

关于为什么我会收到此错误的任何想法?

我的项目运行良好。我将它复制到外部驱动器和我的笔记本电脑上,以便在路上工作;它工作正常。我将它复制回我的桌面并遇到大量无效解释器等问题,所以我创建了一个新项目并只复制了脚本,创建了一个新的 requirements.txt 并安装了所有包,但是当我运行它时,我得到这个错误:

Traceback (most recent call last):
  File "E:\Dev\spot_new\flask_blog\run.py", line 1, in <module>
    from flaskblog import app
  File "E:\Dev\spot_new\flask_blog\flaskblog\__init__.py", line 3, in <module>
    from flask_bcrypt import Bcrypt
  File "E:\Dev\spot_new\venv\lib\site-packages\flask_bcrypt.py", line 21, in <module>
    from werkzeug.security import safe_str_cmp
ImportError: cannot import name 'safe_str_cmp' from 'werkzeug.security' (E:\Dev\spot_new\venv\lib\site-packages\werkzeug\security.py)

我已经尝试卸载 Python、Anaconda、PyCharm,删除我能找到的每一个 reg 键和环境变量,看起来像 pythonic,从头开始重新安装但仍然没有骰子。

python flask werkzeug
7个回答
60
投票

Werkzeug 今天发布了 v2.1.0,删除了

werkzeug.security.safe_str_cmp
.

您可以通过将

Werkzeug~=2.0.0
固定在您的 requirements.txt 文件(或类似文件)中来解决此问题。

pip install Werkzeug~=2.0.0

在那之后你很可能还会有一个与jinja包相关的AttributeError,所以如果你有它,也运行:

pip install jinja2~=3.0.3

9
投票

这个问题也可以通过升级 flask_login 来解决。

pip install --upgrade flask_login

6
投票

Werkzeug 2.1.0 发行说明 推荐使用

hmac
等价物。作为参考,here 是 wekzeug 2.0.x 中
safe_str_cmp
的实现,这里是精简版:

import hmac

def safe_str_cmp(a: str, b: str) -> bool:
    """This function compares strings in somewhat constant time. This
    requires that the length of at least one string is known in advance.

    Returns `True` if the two strings are equal, or `False` if they are not.
    """

    if isinstance(a, str):
        a = a.encode("utf-8")  # type: ignore

    if isinstance(b, str):
        b = b.encode("utf-8")  # type: ignore

    return hmac.compare_digest(a, b)

或更精简的一个:

import hmac
str_to_bytes = lambda s: s.encode("utf-8") if isinstance(s, str) else s
safe_str_cmp = lambda a, b: hmac.compare_digest(str_to_bytes(a), str_to_bytes(b))

1
投票

这对我有用,因为我的错误是在 falsk_wtf 中(请参阅您所处情况的依赖包,例如:这里是 flask-bcrypt):

pip uninstall flask_wtf
pip install flask_wtf

0
投票
ImportError: cannot import name 'safe_str_cmp' from 'werkzeug.security

解决 ImportError: cannot import name '

safe_str_cmp
' from '
werkzeug.security
' Error 你也可以

Downgrade Werkzeug to 2.0.0

工作正常所以你可以将 Werkzeug 降级到 2.0.0 只需运行这个命令:

pip 安装 Werkzeug==2.0.0

OR

pip install Werkzeug==2.1.0

现在必须解决您的错误。


0
投票

这里的 import 声明是由于 flask-bcrypt 版本过时。

您可以通过导入最新版本的 flask-bcrypt 来解决此问题,在撰写本文时该版本为 1.0.1:

pip install --upgrade flask-bcrypt

新版本为此导入并使用了hmac,而不是werkzeug的security。

注意:这里的其他答案很可能在撰写本文时是正确的,我不确定 flask-bcrypt 更新的时间范围


0
投票

我有 Flask 2.2,我做到了:

pip 安装 Flask==2.0.0

现在正在工作!!

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