Как устранить ошибку «строковый аргумент без кодировки» с помощью bcrypt/SQLAlchemy?

Обратите внимание, что я обнаружил проблемы, похожие на мою, но ни одно из исправлений не применимо. Также обратите внимание, что этот код работает в 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, а затем хешируется.

Когда я пытаюсь вставить в таблицу, я получаю сообщение об ошибке:

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': '$2a$12$ED6YdEPAb5pt0wTMno9M/OhpCNXo1CyPxmZuUK.YHdxrahW67DEDS', 'username': 'username'}]]

Чем моя проблема отличается от ответов, которые я нашел, так это тем, что, например, здесь sqlalchemy-insert-string-argument-without-encoding, выполняемый запрос собирается непосредственно с использованием столбцов модели, поэтому легко сделать кодирование на данном этапе.

Я безуспешно пытался выяснить, где это закодировать, и даже пытался переключить тип данных с BINARY на TEXT (бэкэнд — MySQL), но ничего не помогло.

Я не совсем уверен, как поступить.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
562
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я смог воспроизвести вашу проблему, используя

session.add(
    Client(
        is_system_administrator=True,
        password = "$2a$12$ED6YdEPAb5pt0wTMno9M/OhpCNXo1CyPxmZuUK.YHdxrahW67DEDS",
        username = "username",
    )
)

Тем не менее, это, кажется, работает

session.add(
    Client(
        is_system_administrator=True,
        password=bytes(
            "$2a$12$ED6YdEPAb5pt0wTMno9M/OhpCNXo1CyPxmZuUK.YHdxrahW67DEDS",
            "ascii",
        ),
        username = "username",
    )
)

Другие вопросы по теме