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

p8h8hvxi  于 2022-11-08  发布在  PyCharm
关注(0)|答案(5)|浏览(623)

为什么我会得到这个错误的想法?
我的项目运行得很好,我把它复制到一个外部驱动器和我的笔记本电脑上,以便在路上工作;它运行得很好。我把它复制回我的桌面,但遇到了一系列无效解释器等问题,所以我做了一个新项目,只复制了脚本,做了一个新的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,删除我能找到的每一个看起来像Python的reg键和环境变量,从头开始重新安装,但仍然没有效果。

jq6vz3qz

jq6vz3qz1#

Werkzeug今天发布了v2.1.0,删除了werkzeug.security.safe_str_cmp
您可以通过在requirements.txt文件(或类似文件)中固定Werkzeug~=2.0.0来解决此问题。

pip install Werkzeug~=2.0.0

在此之后,很可能还会出现与jinja包相关的AttributeError,因此,如果出现了该错误,也可以运行:

pip install jinja2~=3.0.3
wnrlj8wa

wnrlj8wa2#

Werkzeug 2.1.0发行说明建议使用hmap的等价物。作为参考,这里是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))
mi7gmzs6

mi7gmzs63#

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

pip install --upgrade flask_login
kx1ctssn

kx1ctssn4#

ImportError: cannot import name 'safe_str_cmp' from 'werkzeug.security

要解决导入错误:无法从ウwerkzeug.security Ж导入名称ウsafe_str_cmp Ж。错误。您还可以
Downgrade Werkzeug to 2.0.0
运行正常所以你可以把Werkzeug降级到2.0.0运行这个命令:
pip安装工具==2.0.0

OR

pip install Werkzeug==2.1.0
现在你错误必须得到解决。

9gm1akwq

9gm1akwq5#

这里的import语句是由于flak-bcrypt的一个过时版本。
您可以通过导入flank-bcrypt的最新版本来解决此问题,在编写本文时该版本为1.0.1:
pip install --upgrade flask-bcrypt
新版本导入并使用hmac,而不是werkzeug的安全性。
注:很有可能在写这篇文章的时候其他的答案都是正确的,我不确定flank-bcrypt更新的时间

相关问题