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


    七、找回密码功能

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

  • 相关阅读:
    leetcode: power of three 三种解法
    继续写java和socket
    node中的事件发射器
    谈一谈Crsf和XSS攻击
    谈一谈那些框架们
    【Mysql数据库】学习笔记
    【数据库】DML-增删改查-SQL实现
    【Jsp,Servlet初学总结】 含 cookie和session的使用
    struct和typedef struct彻底明白了
    Android 学习之路
  • 原文地址:https://www.cnblogs.com/Sweltering/p/9971581.html
Copyright © 2020-2023  润新知