一、流程分析:
1.点击忘记密码====》forget.html页面,输入邮箱和验证码,发送验证链接网址的邮件====》发送成功,跳到send_success.html提示
2.到邮箱里找到验证链接网址,访问重设密码网址reset.html===》重设密码提交数据,成功则返回首页,失败则返回错误信息
二、
1.users/forms.py文件中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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中相关代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
......
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
<!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
1
2
3
4
5
6
7
8
9
10
|
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "UTF-8" >
< title >Title</ title >
</ head >
< body >
< h1 >发送邮件成功,快去邮箱查看吧!(收件箱没有,垃圾箱一定有……)</ h1 >
</ body >
</ html >
|
#pwd_reset.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
<!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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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()方法及其配置 详见上一篇文章
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://www.cnblogs.com/xuepangzi/p/8847090.html