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 相关文章推荐
python创建和删除目录的方法
Apr 29 Python
python动态性强类型用法实例
May 09 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
Jan 29 Python
Python用for循环实现九九乘法表
May 31 Python
基于Python pip用国内镜像下载的方法
Jun 12 Python
使用Python更换外网IP的方法
Jul 09 Python
Python 50行爬虫抓取并处理图灵书目过程详解
Sep 20 Python
详解Python3定时器任务代码
Sep 23 Python
详解Python在使用JSON时需要注意的编码问题
Dec 06 Python
python实现用类读取文件数据并计算矩形面积
Jan 18 Python
零基础学Python之前需要学c语言吗
Jul 21 Python
Python 中 sorted 如何自定义比较逻辑
Feb 02 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/07/15 PHP
PHP $_SERVER详解
2009/01/16 PHP
PHP中文分词 自动获取关键词介绍
2012/11/13 PHP
用Php编写注册后Email激活验证的实例代码
2013/03/11 PHP
php魔术变量用法实例详解
2014/11/13 PHP
浅谈PHP中的
2016/04/23 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
PHP常见数组排序方法小结
2018/08/20 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
2018/12/24 PHP
tagName的使用,留一笔
2006/06/26 Javascript
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
js 编码转换 gb2312 和 utf8 互转的2种方法
2013/08/07 Javascript
js的.innerHTML = &quot;&quot;IE9下显示有错误的解决方法
2013/09/16 Javascript
jQuery文字提示与图片提示效果实现方法
2016/07/04 Javascript
js遍历map javaScript遍历map的简单实现
2016/08/26 Javascript
js禁止表单重复提交
2017/08/29 Javascript
vue中如何让子组件修改父组件数据
2018/06/14 Javascript
js实现删除li标签一行内容
2019/04/16 Javascript
js实现跟随鼠标移动的小球
2019/08/26 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
Ant design vue中的联动选择取消操作
2020/10/31 Javascript
Python os模块学习笔记
2015/06/21 Python
Python脚本获取操作系统版本信息
2016/12/17 Python
Python 12306抢火车票脚本
2018/02/07 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
2018/11/29 Python
使用Python横向合并excel文件的实例
2018/12/11 Python
Python3实现统计单词表中每个字母出现频率的方法示例
2019/01/28 Python
input file上传文件样式支持html5的浏览器解决方案
2012/11/14 HTML / CSS
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
英国时尚女装购物网站:Missguided
2018/08/23 全球购物
生产经理的自我评价分享
2013/11/07 职场文书
硕士研究生自我鉴定
2013/11/08 职场文书
学习雷锋精神心得体会范文
2014/03/12 职场文书
移交协议书
2014/08/19 职场文书
呐喊读书笔记
2015/06/30 职场文书
SpringCloud之@FeignClient()注解的使用方式
2021/09/25 Java/Android