Flask TypeError: Expected bytes

flask web开发一书的源码,更改密码的功能部分,本地测试验证时报错。相关代码贴上。
视图函数模块auth/view.py

@auth.route('/change-password', methods=['GET', 'POST'])
@login_required
def change_password():
    form = ChangePasswordForm()
    if form.validate_on_submit():
        if current_user.verify_password(form.old_password.data):
            current_user.password = User(password=form.password.data)
            db.session.add(current_user)
            flash('Your password had been updated.')
            return redirect(url_for('main.index'))
        else:
            flash('Invalid password.')
    return render_template('auth/change_password.html', form=form)

表单auth/form.py

class ChangePasswordForm(Form):
    old_password = PasswordField('Old password', validators=[Required()])
    password = PasswordField('New password', validators=[Required(), EqualTo('password2', message='Passwords must match.')])
    password2 = PasswordField('Confirm new password', validators=[Required()])
    submit = SubmitField('Change Password')

数据库模型models.py

class User(UserMixin, db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(64), unique=True, index=True)
    username = db.Column(db.String(64), unique=True, index=True)
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
    password_hash = db.Column(db.String(128))


    @property
    def password(self):
        raise AttributeError('password is not a readable attribute')

    @password.setter
    def password(self, password):
        self.password_hash = generate_password_hash(password)

    def verify_password(self, password):
        return check_password_hash(self.password_hash, password)

报错信息

builtins.TypeError
TypeError: Expected bytes  

File "/Users/tangxin/flaskdev/app/auth/views.py", line 49, in change_password
current_user.password = User(password=form.password.data) 

File "/Users/tangxin/flaskdev/app/models.py", line 71, in password
self.password_hash = generate_password_hash(password)
阅读 5.2k
2 个回答

手动调用下这个方法 generate_password_hash

应该是传入的密码数据类型不对

Python 3中Str和Byte是不同的类型。

password_byte = password.encode('utf') #然后传入这个变量
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题