一。前端页面:
(1)点击忘记密码会跳到
(2)点击发送邮件后会收到重置密码的邮箱链接
(3)访问该链接重置密码,修改成功后会重定向到login页面
(4)form表单
class ForgetForm(forms.Form):
email = forms.EmailField(required=True, label='邮箱', widget=forms.TextInput(
attrs={"class": "form-control", "placeholder": "请输入邮箱账号", "value": ""}),
max_length=100, error_messages={"required": "邮箱不能为空", "invalid": ""})
newpwd = forms.CharField(required=True, label='新密码', widget=forms.PasswordInput(
attrs={"placeholder": "请输入新密码"}
))
repwd = forms.CharField(required=True, label='新密码', widget=forms.PasswordInput(
attrs={"placeholder": "请输入新密码"}
(5)前端代码
邮件发送页面:
<form action="{{ forgetemail }}" method="post">
{% csrf_token %}
{{ form.email }}
<button type="submit">发送邮箱验证</button>
</form>
密码重置页面:
<form action="{{ repasswd }}" method="post">
{% csrf_token %}
{{ form.newpwd }}
{{ form.repwd }}
<button type="submit">重置密码</button>
</form>
二。后端views+sendemail
sendmail.py
def code_RQ(codelength=8):
code=''
str='AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
str_len=len(str)-1
for i in range(codelength):
code+=str[random.randint(0,str_len)]
return code
# print(code())
##发送邮件
def send_register_email(email,send_type):
# 实例化models的邮箱验证模块
email_record=EmailRecord()
##将给用户发送的信息保存到数据库中
##实例化验证码模块
code=code_RQ()
email_record.code=code
email_record.email=email
email_record.send_type=send_type
email_record.save()
##邮件内容
##判断发送邮件的类型
if send_type == 'register':
title='注册链接'
body='请点击下面链接激活账号:http://127.0.0.1:8000/active/%s' %code
##发送邮件
"""
subject, message, from_email, recipient_list,
fail_silently=False, auth_user=None, auth_password=None,
connection=None, html_message=None
主题 ,信息,发件人,收件人列表
"""
send_status=send_mail(title,body,EMAIL_FROM,[email])
if send_status:
print('注册邮件发送成功')
##返回验证码
# return code
else:
title='邮箱验证链接'
body='请点击下面链接重置密码:http://127.0.0.1:8000/repasswd/%s' %code
send_status=send_mail(title,body,EMAIL_FROM,[email])
if send_status:
print('邮箱验证码发送成功')
views
##忘记密码
from index.send import send_register_email
##发送邮箱验证码
@login_required(login_url='login/')
def pwdforget(request):
form=ForgetForm(request.POST)
if request.method =='POST':
form = ForgetForm(request.POST)
email = request.POST.get('email')
print(email)
user_email = User.objects.filter(email=email)
print(user_email)
if user_email:
send_register_email(email,"forget")
return render(request,'forgetpwd.html',locals())
##重置密码
@login_required(login_url='login/')
def repasswd(request,repwd_code):
if request.method=='POST':
form = ForgetForm(request.POST)
newpwd = request.POST.get('newpwd')
repwd = request.POST.get('repwd')
all_record = EmailRecord.objects.filter(code=repwd_code)
if all_record:
for cord in all_record:
##通过这个邮箱验证码找到EmailRecord的email
email = cord.email
if newpwd == repwd:
##获取该email所有字段信息
change_pwd = User.objects.get(email=email)
##修改新的密码(passwd字段)
change_pwd.passwd = make_password(newpwd)
change_pwd.save()
messages.success(request, '密码修改成功')
#修改成功的重定向到login
return redirect(reverse('login')) ##locals()显示当前函数所有局部变量
else:
messages.warning(request, '两次密码不一致')
else:
form = ForgetForm()
return render(request,'repasswd.html',locals())
三。urls
##发送邮件
path('pwdforget/',views.pwdforget,name='pwdforget'),
##重置密码(接受邮件中url的参数)
path('repasswd/<str:repwd_code>',views.repasswd,name='repasswd')