(项目)在线教育平台(五)

七、找回密码功能

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

  在找回密码页面点击提交后,发送找回密码邮件。

扫描二维码关注公众号,回复: 4112510 查看本文章

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页面的一些其他需要修改的地方:

猜你喜欢

转载自www.cnblogs.com/Sweltering/p/9971581.html