ImportError: cannot import name 'safe_str_cmp' from 'werkzeug.security'
ImportError: cannot import name 'safe_str_cmp' from 'werkzeug.security'
关于我为什么会收到此错误的任何想法?
我的项目运行良好。我将它复制到外部驱动器和我的笔记本电脑上,以便在路上工作;它工作正常。我将它复制回我的桌面并遇到了无效解释器等问题,所以我创建了一个新项目并只复制了脚本,创建了一个新的 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,删除我能找到的每个注册码和环境变量,看起来像 pythonic,从头开始重新安装但仍然没有骰子。
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
Werkzeug 2.1.0 发行说明建议使用 hmap
等效项。作为参考,here 是来自 wekzeug 2 的 safe_str_cmp
的实现。0.x,这里是 stripped-down 版本:
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)
甚至更多stripped-down一个:
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))
ImportError: cannot import name 'safe_str_cmp' from 'werkzeug.security
解决 ImportError: cannot import name 'safe_str_cmp
' from 'werkzeug.security
' 错误你也可以
Downgrade Werkzeug to 2.0.0
工作正常所以你可以将 Werkzeug 降级到 2.0.0 只需 运行 这个命令:
pip install Werkzeug==2.0.0
OR
pip install Werkzeug==2.1.0
现在必须解决您的错误。
关于我为什么会收到此错误的任何想法?
我的项目运行良好。我将它复制到外部驱动器和我的笔记本电脑上,以便在路上工作;它工作正常。我将它复制回我的桌面并遇到了无效解释器等问题,所以我创建了一个新项目并只复制了脚本,创建了一个新的 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,删除我能找到的每个注册码和环境变量,看起来像 pythonic,从头开始重新安装但仍然没有骰子。
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
Werkzeug 2.1.0 发行说明建议使用 hmap
等效项。作为参考,here 是来自 wekzeug 2 的 safe_str_cmp
的实现。0.x,这里是 stripped-down 版本:
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)
甚至更多stripped-down一个:
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))
ImportError: cannot import name 'safe_str_cmp' from 'werkzeug.security
解决 ImportError: cannot import name 'safe_str_cmp
' from 'werkzeug.security
' 错误你也可以
Downgrade Werkzeug to 2.0.0
工作正常所以你可以将 Werkzeug 降级到 2.0.0 只需 运行 这个命令:
pip install Werkzeug==2.0.0
OR
pip install Werkzeug==2.1.0
现在必须解决您的错误。