如何使用 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",
    )
)