握草,终于进入用户认证的最终章节了,觉得作者不错,到了这里,已经开始让你尝试自己写代码了
虽然在github上面 Miguelgrinberg 也放上了代码,不过还是尽量自己写吧
首先是对于已经注册认证的用户,他们有时候想修改密码,那我们肯定要为用户专门放一个页面,用来修改密码
那无非是做一个表单和页面,通过表单来链接数据库修改最后的密码
以我们的经验,一般这样的表单有3行,老密码,新密码,确认新密码
所以如下(本来form和路由都自己编名字了。。。。后来发现到后面和书对照起来太麻烦了。。。还是老实点先按照书来做吧。。。。)
class ChangePasswordForm(Form):
oldpassword=PasswordField('Oldpassword',validators=[Required()])
newpassword=PasswordField('Newpassowrd',validators=[Required(),EqualTo('newpassword2',message='Password must match.')])
newpassword2=PasswordField('Confirm password',validators=[Required()])
submit = SubmitField('Register')
而对应的路由设置如下:
@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.oldpassword.data): #在表单提交有效的情况下,如果当前用户表单内输入的老密码验证返回结果是True
current_user.password=form.newpassword.data #则当前用户的密码更新为表单里面的newpassword(这里用到的是password.setter装饰器)
db.session(current_user) #提交更新
db.session.commit()
return redirect(url_for('main.index'))
else:
flash('Your oldpassword is wrong') #不然的话,出现提示消息,老密码错误
return render_template('auth/change_password.html',form = form)
这里需要注意的是:current_user实际上可以作为object来直接使用的,db.session.add(current_user)就可以显示这个作用
后端逻辑做完了,那前段页面也要做一个
{% extends "base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}Flasky-Change Password{% endblock %}
{% block page_content %}
<div class="page-header">
<h3>Please reset your password as below</h3>
</div>
{
{wtf.quick_form(form)}} #快速装饰表单
{% endblock %}
效果图如下:
需要注意的是,我们这里添加了一个change password的按钮,这个超链接最好还是放在base.html里面
这样我们的密码修改功能就完成了
--------------------------------------------------------------------------功能分割线-----------------------------------------------------------------------------------------------
但是有时候你忘记了密码,那你连改密码都改不了
所以就要用到忘记密码功能了,这个功能的作用基本上就是------>通过邮箱发送给你一个链接------->点击链接进入修改密码页面--------->设置新密码
对于我们平时的经验来说,一般是通过邮箱先认证一下,再修改密码
那这样,等于是要有2个页面产生,一个是让你输入邮箱并发送邮件的页面,第二个是你邮箱点击链接返回过来的页面,可以修改密码
而且,需要做2个表单,一个是输入邮箱并发送的表单,另外一个是修改密码的表单
先来看要输入email地址的表单类
class PasswordResetRequestForm(Form):
email=StringField('Email Address',validators=[Required(),Length(1,64),Email()])
submit = SubmitField('Send out') #提交表单以发送EMAIL
再来看修改密码的表单类
class