Получение ошибки «Ожидаемые байты» при попытке обновить запись в БД - PullRequest
0 голосов
/ 09 февраля 2020

Мой API позволяет пользователю обновлять свои данные пользователя с помощью запроса PUT к конечной точке /User.

Однако, когда я пытаюсь отправить обновление. При попытке сохранить пароль возникает ошибка, за исключением Expected Bytes.

Ниже приведен мой маршрут:

@UserNS.expect(UserModel)
    @token_required
    def put(self):
        """Updates the user details associated with the API token."""
        token = request.headers['Token']
        data = request.get_json()
        if not data:
            return jsonify({'message': 'Please enter some user data'})
        else:
            update_user = User.query.filter_by(api_token=token).first()
            print("Updating user details")
            print("Current: " + update_user.username + " " + update_user.email)
            print("New: " + data["Username"] + " " + data["Email Address"])
            try:
                update_user.username = str(data["Username"])
                update_user.email = str(data['Email Address'])
                print("Trying to save password...")
                update_user.set_password(data['Password'])
                print("uh oh...")
                db.session.commit()
                return {'Message': 'Record updated!'}
            except Exception as e:
                print(e)
                return {'Message': 'Username or email address is invalid!'}

Ниже представлена ​​моя модель API:

UserModel = api.model('User', {'Username': fields.String(), 'Email Address': fields.String(), 'Password': fields.String()})

И моя модель SQLAlchemy:

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True, unique=True)
    api_token = db.Column(db.String(50), unique=True)
    username = db.Column(db.String(128), index=True, unique=True)
    email = db.Column(db.String(128), index=True, unique=True)
    password_hash = db.Column(db.String(128))
    todos = db.relationship('Todo', backref='owner', lazy='dynamic')

Я использую очень похожие данные для регистрации учетной записи. Так что не уверен, что это не сохранение новых данных.

Редактировать: Я думаю, что проблема Python заключается в преобразовании update_user в не байтовый объект здесь:

update_user = User.query.filter_by(api_token=token).first()

Так что мне нужен способ чтения, чтобы сделать запрос и сохранить его для манипуляции. Без преобразования его в не байтовый объект.

edit2:

Flask-login используется для хранения пароля с использованием следующего определения:

def set_password(self, password):
    self.password_hash = generate_password_hash(password)

1 Ответ

1 голос
/ 09 февраля 2020

Базовый метод werkzeug.security.generate_password_hash ожидает str в качестве ввода. Если вы передадите ему недопустимый тип, такой как int, вы получите исключение TypeError: Expected bytes. Метод docs здесь .

Как отмечалось в моем комментарии выше, существуют учебные пособия , которые показывают рабочие примеры, обеспечивающие правильные типы ввода в форме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...