视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
django开发忘记密码通过邮箱找回功能示例_python
2020-11-27 14:22:06 责编:小采
文档


这篇文章主要介绍了django 开发忘记密码通过邮箱找回功能示例,现在分享给大家,也给大家做个参考。一起过来看看吧

一、流程分析:

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>


 <p 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>
 </p>


</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>


 <p 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>
 </p>

</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()方法及其配置 详见上一篇文章

下载本文
显示全文
专题