django 开发忘记密码通过邮箱找回功能示例


Posted in Python onApril 17, 2018

一、流程分析:

1.点击忘记密码====》forget.html页面,输入邮箱和验证码,发送验证链接网址的邮件====》发送成功,跳到send_success.html提示

2.到邮箱里找到验证链接网址,访问重设密码网址reset.html===》重设密码提交数据,成功则返回首页,失败则返回错误信息

二、

1.users/forms.py文件中

from django import forms
from captcha.fields import CaptchaField


.......

#forget.html中,用于验证邮箱格式和验证码
class ForgetForm(forms.Form):
  email=forms.EmailField(required=True)
  captcha=CaptchaField(error_messages={'invalid':'验证码错误'})

#reset.html中,用于验证新设的密码长度是否达标
class ResetForm(forms.Form):
  newpwd1=forms.CharField(required=True,min_length=6,error_messages={'required': '密码不能为空.', 'min_length': "至少6位"})
  newpwd2 = forms.CharField(required=True, min_length=6, error_messages={'required': '密码不能为空.', 'min_length': "至少6位"})

2.users/views.py中相关代码:

......
from django.shortcuts import render,redirect
from django.http import HttpResponse
from users.form import ForgetForm,ResetForm
from .models import UserProfile
from django.contrib.auth.hashers import make_password
from apps.utils.email_send import send_register_email
from .models import EmailVerifyRecord

......

class ForgetPwdView(View):
  '''忘记密码'''
  def get(self,request):
    forget_form=ForgetForm()
    return render(request,'forget.html',{'forget_form':forget_form})
  def post(self,request):
    forget_form = ForgetForm(request.POST)
    if forget_form.is_valid():
      email=request.POST.get('email','')
      send_register_email(email,'forget')
      return render(request,'send_success.html')
    else:
      return render(request,'forget.html',{'forget_form':forget_form})


class ResetView(View):
  '''重置密码'''
  def get(self,request,active_code):
    record=EmailVerifyRecord.objects.filter(code=active_code)
    print(record)
    if record:
      for i in record:
        email=i.email
        is_register=UserProfile.objects.filter(email=email)
        if is_register:
          return render(request,'pwd_reset.html',{'email':email})
    return redirect('index')


#因为<form>表单中的路径要是确定的,所以post函数另外定义一个类来完成
class ModifyView(View):
  """重置密码post部分"""
  def post(self,request):
    reset_form=ResetForm(request.POST)
    if reset_form.is_valid():
      pwd1=request.POST.get('newpwd1','')
      pwd2=request.POST.get('newpwd2','')
      email=request.POST.get('email','')
      if pwd1!=pwd2:
        return render(request,'pwd_reset.html',{'msg':'密码不一致!'})
      else:
        user=UserProfile.objects.get(email=email)
        user.password=make_password(pwd2)
        user.save()
        return redirect('index')
    else:
      email=request.POST.get('email','')
      return render(request,'pwd_reset.html',{'msg':reset_form.errors})

3.新建forget.html, success_send.html, pwd_reset.html

#forget.html

<!DOCTYPE html>
{% load staticfiles %}
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>忘记密码</title>

<style>
.out{
  width: 500px;
  height: 900px;
  margin: 0 auto;
  margin-top: 100px;
}
</style>
</head>
<body>


  <div class="out">
    <h1>真粗心,忘了密码吧?快通过邮箱找回密码吧!</h1>
    <form method="post" action="{% url 'forget_pwd' %}">
      <P><span>邮箱:</span><input type="text" name="email"></P>
      <P><span>验证码:</span>{{ forget_form.captcha }}</P>
      {% csrf_token %}
      <p><input type="submit" value="确认发送验证邮件"></p>
    </form>
    <h1>{{ forget_form.errors }}</h1>
  </div>


</body>
</html>

#success_send.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
<h1>发送邮件成功,快去邮箱查看吧!(收件箱没有,垃圾箱一定有……)</h1>
</body>
</html>

#pwd_reset.html

<!DOCTYPE html>
{% load staticfiles %}
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>重置密码</title>

<style>
.out{
  width: 500px;
  height: 900px;
  margin: 0 auto;
  margin-top: 100px;
}
</style>
</head>
<body>


  <div class="out">
    <h1>可以重新设置一个好记的新密码啦!</h1>
    <form method="post" action="{% url 'modify' %}">
      <P><span>新密码:</span><input type="password" name="newpwd1" placeholder="至少6位"></P>
      <P><span>确认新密码:</span><input type="password" name="newpwd2" placeholder="至少6位"></P>
      {% csrf_token %}
      <input type="hidden" name="email" value="{{ email }}">
      <p><input type="submit" value="确认"></p>
    </form>
    <h1>{{ msg }}</h1>
  </div>

</body>
</html>

4.配置相关的urls.py:

from users.views import ForgetPwdView,ResetView,ModifyView

......

urlpatterns = [
  .....

  #忘记密码
  path('forget/',ForgetPwdView.as_view(),name='forget_pwd'),
  #重置密码
  path('reset/<str:active_code>',ResetView.as_view(),name='reset'),
  path('modify/',ModifyView.as_view(),name='modify'),


  ......
]

运行项目,点击 忘记密码 链接(<a href="{% url 'forget_pwd' %}" rel="external nofollow" >忘记密码</a>),就可以完成通过邮箱找回密码的功能啦!

5.send_register_email()方法及其配置 详见上一篇文章

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python3中dict(字典)的使用方法示例
Mar 22 Python
Python 快速实现CLI 应用程序的脚手架
Dec 05 Python
Python动刷新抢12306火车票的代码(附源码)
Jan 24 Python
利用numpy和pandas处理csv文件中的时间方法
Apr 19 Python
Django框架会话技术实例分析【Cookie与Session】
May 24 Python
python腾讯语音合成实现过程解析
Aug 01 Python
基于Python实现剪切板实时监控方法解析
Sep 11 Python
使用Python脚本从文件读取数据代码实例
Jan 19 Python
python 错误处理 assert详解
Apr 20 Python
python 删除系统中的文件(按时间,大小,扩展名)
Nov 19 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 Python
pd.drop_duplicates删除重复行的方法实现
Jun 16 Python
Python实现购物车程序
Apr 16 #Python
神经网络(BP)算法Python实现及应用
Apr 16 #Python
python读取视频流提取视频帧的两种方法
Oct 22 #Python
python读取和保存视频文件
Apr 16 #Python
Python读取视频的两种方法(imageio和cv2)
Apr 15 #Python
python2.7实现FTP文件下载功能
Apr 15 #Python
python实现多线程网页下载器
Apr 15 #Python
You might like
PHP新手上路(三)
2006/10/09 PHP
php进行ip地址掩码运算处理的方法
2016/07/11 PHP
详解PHP归并排序的实现
2016/10/18 PHP
php面试实现反射注入的详细方法
2019/09/30 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
Raphael一个用于在网页中绘制矢量图形的Javascript库
2013/01/08 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
js弹窗返回值详解(window.open方式)
2014/01/11 Javascript
在点击div中的p时,如何阻止事件冒泡
2017/02/07 Javascript
jQuery中用on绑定事件时需注意的事项
2017/03/19 Javascript
JavaScript canvas实现围绕旋转动画
2017/11/18 Javascript
vue input输入框模糊查询的示例代码
2018/05/22 Javascript
vueScroll实现移动端下拉刷新、上拉加载
2019/03/22 Javascript
Vue开发环境中修改端口号的实现方法
2019/08/15 Javascript
JavaScript对象原型链原理解析
2020/01/22 Javascript
JavaScript实现串行请求的示例代码
2020/09/14 Javascript
Python入门篇之面向对象
2014/10/20 Python
Python导入oracle数据的方法
2015/07/10 Python
python中(str,list,tuple)基础知识汇总
2018/02/20 Python
pycharm重命名文件的方法步骤
2019/07/29 Python
Python Subprocess模块原理及实例
2019/08/26 Python
Python基于network模块制作电影人物关系图
2020/06/19 Python
Python实现Appium端口检测与释放的实现
2020/12/31 Python
斯洛伐克时尚服装网上商店:Cellbes
2016/10/20 全球购物
会话Bean的种类
2013/11/07 面试题
大学生最新职业生涯规划书范文
2014/01/12 职场文书
理工学院学生自我鉴定
2014/02/23 职场文书
市场营销战略计划书
2014/05/06 职场文书
酒店管理失职检讨书
2014/09/16 职场文书
党的群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
2015年元旦主持词开场白
2014/12/14 职场文书
2015年学习部工作总结范文
2015/03/31 职场文书
运动员代表致辞
2015/07/29 职场文书
女方家长婚礼答谢词
2015/09/29 职场文书
幼儿园国培研修日志
2015/11/13 职场文书
Mysql数据库按时间点恢复实战记录
2021/06/30 MySQL