七、找回密码功能
1、找回密码页面配置
将找回密码页面forgetpwd.html前端文件拷贝到项目的templates文件夹内。
然后修改注册页面register.html初始文件中的静态文件访问路径,修改成{% static '静态文件路径' %}的形式。
2、后端找回密码接口
2.1 编写找回密码接口
在users/form.py文件中编写form表单验证的代码:
1 class ForgetPwdForm(forms.Form): 2 """找回密码表单验证""" 3 email= forms.EmailField(required=True) 4 captcha = CaptchaField(error_messages={'invalid': '验证码错误'})
然后在users/views.py文件中编写找回密码的接口:
1 class ForgetPwdView(View): 2 """找回密码""" 3 def get(self, request): 4 forget_form = ForgetPwdForm() 5 return render(request, 'forgetpwd.html', {'forget_form': forget_form})
最后配置找回密码的url:
1 from users.views import ForgetPwdView 2 3 urlpatterns = [ 4 path('forget/', ForgetPwdView.as_view(), name='forget_pwd'), # 找回密码 5 ]
2.2 前端页面配置
首先在login.html中修改找回密码的url:
然后修改找回页面验证码图片显示的问题:
2.3 发送找回密码邮件
在utils/email_sendl.py文件中添加找回密码的邮件:
1 if send_type == 'forget': 2 email_title = '知能网找回密码链接' 3 email_body = '请点击下面的链接找回你的密码:http://127.0.0.1:8000/reset/{}'.format(code) 4 5 # 发送邮件 6 send_status = send_mail(email_title, email_body, EMAIL_FROM, [email]) 7 if send_status: 8 pass
在找回密码页面点击提交后,发送找回密码邮件。
2.4 完善找回密码接口
1 class ForgetPwdView(View): 2 """找回密码""" 3 def get(self, request): 4 forget_form = ForgetPwdForm() 5 return render(request, 'forgetpwd.html', {'forget_form': forget_form}) 6 7 def post(self, request): 8 forget_form = ForgetPwdForm(request.POST) 9 if forget_form.is_valid(): 10 # form验证成功,获取邮箱 11 email = request.POST.get('email', None) 12 13 # 发送邮件 14 send_register_email(email, 'forget') 15 return render(request, 'send_success.html') 16 else: 17 return render(request, 'forgetpwd.html', {'forget_form': forget_form})
接口完善之后前端的forgetpwd.html还需要修改其中的几个地方:
然后现在就可以测试输入邮箱提交之后是否发送了找回密码的邮件。
2.5 重置密码
首先将修改密码的password_reset.html页面放到templates下。
在找回密码的邮件中点击找回密码的链接,进入修改密码的页面,首先需要编写重置密码(get方法获取重置密码页面)的接口:
1 class ResetView(View): 2 """重置密码(get)方法""" 3 def get(self, request, active_code): 4 # 从数据库中获取所有的验证码记录 5 all_records = EmailVerifyRecord.objects.filter(code=active_code) 6 7 if all_records: 8 for record in all_records: 9 # 获取对应的邮箱, 返回重置密码的页面 10 email = record.email 11 return render(request, 'password_reset.html', {'email': email}) 12 else: 13 return render(request, 'active_fail.html') 14 15 return render(request, 'login.html')
然后配置找回密码链接的url:
1 from users.views import ResetView 2 3 urlpatterns = [ 4 re_path('reset/(?P<active_code>.*)/', ResetView.as_view(), name='reset_pwd') # 找回密码链接 5 ]
现在点击找回密码的链接就可以进入重置密码的页面。
现在开始编写重置密码页面的form表单验证的代码,在form.py中加入重置密码表单验证:
1 class ModifyPwdForm(forms.Form): 2 """重置密码表单验证""" 3 password1 = forms.CharField(required=True, min_length=5) 4 password2 = forms.CharField(required=True, min_length=5)
然后编写重置密码的接口:
1 class ModifyPwdView(View): 2 """重置密码""" 3 def post(self, request): 4 modify_form = ModifyPwdForm(request.POST) 5 if modify_form.is_valid(): 6 # 从请求中获取密码和邮箱 7 pwd1 = request.POST.get('password1', '') 8 pwd2 = request.POST.get('password2', '') 9 email = request.POST.get('email', '') 10 11 # 如果两次密码不一致,返回错误信息 12 if pwd1 != pwd2: 13 return render(request, 'password_reset.html', {'email': email, 'msg': '密码不一致'}) 14 15 # 修改数据库中的密码 16 user = UserProfile.objects.get(email=email) 17 user.password = make_password(pwd2) 18 user.save() 19 20 return render(request, 'login.html') 21 else: 22 email = request.POST.get('email', '') 23 return render(request, 'password_reset.html', {'email': email, 'modify_form': modify_form})
在urls中配置重置密码的url:
1 from users.views import ModifyPwdView 2 3 urlpatterns = [ 4 path('modify_pwd/', ModifyPwdView.as_view(), name='modify_pwd'), # 重置密码 5 ]
然后修改password_reset.html页面的一些其他需要修改的地方: