如何使用 bcrypt/SQLAlchemy 解决 "string argument without an encoding" 错误?
How to resolve "string argument without an encoding" error using bcrypt/SQLAlchemy?
请注意,我发现了与我类似的问题,但 none 的修复适用。另外,请注意此代码适用于 python 2.7,但不适用于 3.7。
问题是我有以下型号:
class Client(Base, UserMixin):
"""
Represents a client in the database.
:param id: primary key of test in database
:param uuid: String representation of UUID Version 4 (Random). If client
does not specify, it will generate one on the server. This can be used to
check if things have been uploaded.
:param username: the username for the client, must be unique system-wide.
:param password: the bcrypt password hash for the client.
"""
__tablename__ = 'clients'
__form_keys__ = {'username', 'password', 'is_system_administrator'}
__keys__ = __form_keys__ | {'id', 'uuid', 'client_id'}
__hidden_keys__ = {'username', 'password'}
username = Column(String(255), unique=True, nullable=False)
password = Column(BINARY(60), nullable=False)
其中,根据 bcrypt
的要求,密码使用 BINARY 数据类型进行编码,然后进行哈希处理。
当我尝试插入 table 时,我得到的错误是:
sqlalchemy.exc.StatementError: (builtins.TypeError) string argument without an encoding
[SQL: INSERT INTO clients (uuid, username, password, is_system_administrator) VALUES (%(uuid)s, %(username)s, %(password)s, %(is_system_administrator)s)]
[parameters: [{'is_system_administrator': True, 'password': 'a$ED6YdEPAb5pt0wTMno9M/OhpCNXo1CyPxmZuUK.YHdxrahW67DEDS', 'username': 'username'}]]
我的问题与我找到的答案不同的地方是,例如这里 sqlalchemy-insert-string-argument-without-an-encoding,执行的查询是直接使用模型的列组装的,因此在此阶段很容易进行编码。
我试过,但没有成功,找出在哪里编码这个,我什至尝试将数据类型从 BINARY 切换到 TEXT(后端是 MySQL),但没有任何帮助。
我不确定如何继续。
我能够使用
重现您的问题
session.add(
Client(
is_system_administrator=True,
password="a$ED6YdEPAb5pt0wTMno9M/OhpCNXo1CyPxmZuUK.YHdxrahW67DEDS",
username="username",
)
)
不过,这似乎有效
session.add(
Client(
is_system_administrator=True,
password=bytes(
"a$ED6YdEPAb5pt0wTMno9M/OhpCNXo1CyPxmZuUK.YHdxrahW67DEDS",
"ascii",
),
username="username",
)
)
请注意,我发现了与我类似的问题,但 none 的修复适用。另外,请注意此代码适用于 python 2.7,但不适用于 3.7。
问题是我有以下型号:
class Client(Base, UserMixin):
"""
Represents a client in the database.
:param id: primary key of test in database
:param uuid: String representation of UUID Version 4 (Random). If client
does not specify, it will generate one on the server. This can be used to
check if things have been uploaded.
:param username: the username for the client, must be unique system-wide.
:param password: the bcrypt password hash for the client.
"""
__tablename__ = 'clients'
__form_keys__ = {'username', 'password', 'is_system_administrator'}
__keys__ = __form_keys__ | {'id', 'uuid', 'client_id'}
__hidden_keys__ = {'username', 'password'}
username = Column(String(255), unique=True, nullable=False)
password = Column(BINARY(60), nullable=False)
其中,根据 bcrypt
的要求,密码使用 BINARY 数据类型进行编码,然后进行哈希处理。
当我尝试插入 table 时,我得到的错误是:
sqlalchemy.exc.StatementError: (builtins.TypeError) string argument without an encoding
[SQL: INSERT INTO clients (uuid, username, password, is_system_administrator) VALUES (%(uuid)s, %(username)s, %(password)s, %(is_system_administrator)s)]
[parameters: [{'is_system_administrator': True, 'password': 'a$ED6YdEPAb5pt0wTMno9M/OhpCNXo1CyPxmZuUK.YHdxrahW67DEDS', 'username': 'username'}]]
我的问题与我找到的答案不同的地方是,例如这里 sqlalchemy-insert-string-argument-without-an-encoding,执行的查询是直接使用模型的列组装的,因此在此阶段很容易进行编码。
我试过,但没有成功,找出在哪里编码这个,我什至尝试将数据类型从 BINARY 切换到 TEXT(后端是 MySQL),但没有任何帮助。
我不确定如何继续。
我能够使用
重现您的问题session.add(
Client(
is_system_administrator=True,
password="a$ED6YdEPAb5pt0wTMno9M/OhpCNXo1CyPxmZuUK.YHdxrahW67DEDS",
username="username",
)
)
不过,这似乎有效
session.add(
Client(
is_system_administrator=True,
password=bytes(
"a$ED6YdEPAb5pt0wTMno9M/OhpCNXo1CyPxmZuUK.YHdxrahW67DEDS",
"ascii",
),
username="username",
)
)