尝试更新数据库条目时收到错误“预期字节”

时间:2020-02-09 13:09:32

标签: flask flask-sqlalchemy flask-restplus

我的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 个答案:

答案 0 :(得分:1)

基础 TypeError: Cannot read property 'promise' of undefined 方法期望将werkzeug.security.generate_password_hash作为输入。如果将无效类型(例如int)传递给它,则会得到str异常。方法文档here

正如我在上面的评论中所指出的那样,有tutorials展示了可以确保表单上正确输入类型的工作示例。