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中的descriptor描述器的作用及用法
Jun 27 Python
使用Python读写及压缩和解压缩文件的示例
Jul 08 Python
Python实现的递归神经网络简单示例
Aug 11 Python
python中类的属性和方法介绍
Nov 27 Python
Python使用Pickle模块进行数据保存和读取的讲解
Apr 09 Python
Python实现微信小程序支付功能
Jul 25 Python
python 利用jinja2模板生成html代码实例
Oct 10 Python
pandas读取csv文件提示不存在的解决方法及原因分析
Apr 21 Python
python pymysql链接数据库查询结果转为Dataframe实例
Jun 05 Python
python算的上脚本语言吗
Jun 22 Python
使用bandit对目标python代码进行安全函数扫描的案例分析
Jan 27 Python
Python 转移文件至云对象存储的方法
Feb 07 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视频拍照上传头像功能实现代码分享
2015/10/08 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
thinkPHP框架中执行原生SQL语句的方法
2017/10/25 PHP
php模式设计之观察者模式应用实例分析
2019/09/25 PHP
[转]JS宝典学习笔记
2007/02/07 Javascript
javascript 建设银行登陆键盘
2008/06/10 Javascript
Js callBack 返回前一页的js方法
2008/11/30 Javascript
Extjs学习笔记之二 初识Extjs之Form
2010/01/07 Javascript
javascript中的作用域scope介绍
2010/12/28 Javascript
基于Jquery的开发个代阴影的对话框效果代码
2011/07/28 Javascript
js 3种归并操作的实例代码
2013/10/30 Javascript
jqgrid 表格数据导出实例
2013/11/21 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
JS中prototype的用法实例分析
2015/03/19 Javascript
简介JavaScript中的getUTCFullYear()方法的使用
2015/06/10 Javascript
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
2015/10/09 Javascript
vue.js 左侧二级菜单显示与隐藏切换的实例代码
2017/05/23 Javascript
EasyUI中的dataGrid的行内编辑
2017/06/22 Javascript
使用Vue开发自己的Chrome扩展程序过程详解
2019/06/21 Javascript
vue实现节点增删改功能
2019/09/26 Javascript
python复制文件代码实现
2013/12/23 Python
Python中文件遍历的两种方法
2014/06/16 Python
Python 的 Socket 编程
2015/03/24 Python
Python实现批量读取word中表格信息的方法
2015/07/30 Python
python异常和文件处理机制详解
2016/07/19 Python
Python创建普通菜单示例【基于win32ui模块】
2018/05/09 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
html如何对span设置宽度
2019/10/30 HTML / CSS
ECCO爱步美国官网:来自丹麦的鞋履品牌
2016/11/23 全球购物
JAVA程序设计笔试题面试题一套
2015/07/28 面试题
写自荐信的七个技巧
2013/10/15 职场文书
创业计划书撰写原则
2014/01/25 职场文书
Python制作动态字符画的源码
2021/08/04 Python
使用Ajax实现无刷新上传文件
2022/04/12 Javascript
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js