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)
手动调用下这个方法 generate_password_hash
应该是传入的密码数据类型不对