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的staticmethod与classmethod实现实例代码
Feb 11 Python
值得收藏,Python 开发中的高级技巧
Nov 23 Python
Python中三元表达式的几种写法介绍
Mar 04 Python
Django框架封装外部函数示例
May 28 Python
Python 中的 global 标识对变量作用域的影响
Aug 12 Python
python requests证书问题解决
Sep 05 Python
TensorFlow实现指数衰减学习率的方法
Feb 05 Python
Tensorflow进行多维矩阵的拆分与拼接实例
Feb 07 Python
python如何支持并发方法详解
Jul 25 Python
Django 用户认证Auth组件的使用
Nov 30 Python
Python Django 后台管理之后台模型属性详解
Apr 25 Python
pytorch finetuning 自己的图片进行训练操作
Jun 05 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
E路文章系统PHP
2006/12/11 PHP
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
php获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
php array_reverse 以相反的顺序返回数组实例代码
2017/04/11 PHP
随机显示经典句子或诗歌的javascript脚本
2007/08/04 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
如何设置一定时间内只能发送一次请求
2014/02/28 Javascript
JS中的构造函数详细解析
2014/03/10 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
jquery中attr和prop的区别分析
2015/03/16 Javascript
JavaScript实现的简单幂函数实例
2015/04/17 Javascript
jQuery实现表格行和列的动态添加与删除方法【测试可用】
2016/08/01 Javascript
javascript事件的绑定基础实例讲解(34)
2017/02/14 Javascript
JS中使用gulp实现压缩文件及浏览器热加载功能
2017/07/12 Javascript
angular4强制刷新视图的方法
2018/10/09 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
JavaScript实现京东放大镜效果
2019/12/03 Javascript
Python实现的堆排序算法原理与用法实例分析
2017/11/22 Python
全面分析Python的优点和缺点
2018/02/07 Python
通过python改变图片特定区域的颜色详解
2019/07/15 Python
Python参数传递实现过程及原理详解
2020/05/14 Python
HTML5中新标签和常用标签详解
2014/03/07 HTML / CSS
德国知名健康零食网上商店:Seeberger
2017/07/27 全球购物
墨西哥网上超市:Superama
2018/07/10 全球购物
台湾租车首选品牌:IWS艾维士租车
2019/05/03 全球购物
Furla官网:意大利著名的皮革品牌
2019/08/06 全球购物
英国Radley包德国官网:Radley London德国
2019/11/18 全球购物
运动会广播稿30字
2014/01/21 职场文书
医学类个人求职信范文
2014/02/05 职场文书
书香家庭事迹材料
2014/05/09 职场文书
村长反四风问题个人对照检查材料
2014/09/21 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
丧事答谢词大全
2015/09/30 职场文书
go语言map与string的相互转换的实现
2021/04/07 Golang