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 strip lstrip rstrip使用方法
Sep 06 Python
python实现的一个p2p文件传输实例
Jun 04 Python
Python中decorator使用实例
Apr 14 Python
python 实现自动远程登陆scp文件实例代码
Mar 13 Python
python遍历文件夹下所有excel文件
Jan 03 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
Jun 06 Python
python dataframe向下向上填充,fillna和ffill的方法
Nov 28 Python
python实现批量注册网站用户的示例
Feb 22 Python
python实现的读取网页并分词功能示例
Oct 29 Python
pytorch:torch.mm()和torch.matmul()的使用
Dec 27 Python
在django项目中导出数据到excel文件并实现下载的功能
Mar 13 Python
python+django+selenium搭建简易自动化测试
Aug 19 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代码优化之成员变量获取速度对比
2014/02/28 PHP
PHP两种快速排序算法实例
2015/02/15 PHP
php版微信公众平台接口开发之智能回复开发教程
2016/09/22 PHP
基于JQUERY的多级联动代码
2012/01/24 Javascript
js动画(animate)简单引擎代码示例
2012/12/04 Javascript
无缝滚动js代码通俗易懂(自写)
2013/06/19 Javascript
我的Node.js学习之路(二)NPM模块管理
2014/07/06 Javascript
JavaScript实现大数的运算
2014/11/24 Javascript
js动态切换图片的方法
2015/01/20 Javascript
javascript实现控制div颜色
2015/07/07 Javascript
angularjs在ng-repeat中使用ng-model遇到的问题
2016/01/21 Javascript
canvas实现钟表效果
2017/02/13 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
2017/04/06 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
JS库之wow.js使用方法
2017/09/14 Javascript
微信小程序如何获取openid及用户信息
2018/01/26 Javascript
详解Vue.js项目API、Router配置拆分实践
2018/03/16 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
2018/03/28 jQuery
Vue项目如何引入bootstrap、elementUI、echarts
2020/11/26 Vue.js
[03:51]吞吞映像 每周精彩击杀top10第二弹
2014/06/25 DOTA
[57:38]2018DOTA2亚洲邀请赛3月30日 小组赛A组 OpTic VS OG
2018/03/31 DOTA
[43:57]Liquid vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python 第三方库的安装及pip的使用详解
2017/05/11 Python
windows下 兼容Python2和Python3的解决方法
2018/12/05 Python
对Python使用mfcc的两种方式详解
2019/01/09 Python
Python requests HTTP验证登录实现流程
2020/11/05 Python
iframe跨域的几种常用方法
2019/11/11 HTML / CSS
幼儿园老师辞职信
2014/01/20 职场文书
研究生导师推荐信
2014/09/06 职场文书
政风行风评议心得体会
2014/10/21 职场文书
会计专业2019暑假实习报告
2019/06/21 职场文书
python for循环赋值问题
2021/06/03 Python
anaconda python3.8安装后降级
2021/06/11 Python
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB
python面向对象版学生信息管理系统
2021/06/24 Python
Java生成日期时间存入Mysql数据库的实现方法
2022/03/03 Java/Android