1、form.py验证输入
from django import forms from captcha.fields import CaptchaField class ForgetForm(forms.Form): """找回密码验证码""" email = forms.EmailField(required=True) captcha = CaptchaField(error_messages={'invalid': u'验证码错误'}) # 自定义错误提示信息 class ModifyPwdForm(forms.Form): """重置密码""" password1 = forms.CharField(required=True, min_length=8) # 最小长度8 password2 = forms.CharField(required=True, min_length=8) # 最小长度8
2、utils/email_send.py实现找回密码邮件发送功能
from random import Random from django.core.mail import send_mail #发送邮件模块 from users.models import EmailVerifyRecord from MxOnline.settings import EMAIL_FROM def random_str(randomlength=8): """生成随机字符串""" str = '' chars = 'AaBbCcDdEdFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789' length = len(chars) - 1 random = Random() for i in range(randomlength): str += chars[random.randint(0,length)] return str def send_register_email(email, send_type='register'): email_record = EmailVerifyRecord() code = random_str(16) # 16位长度的随机字符串 email_record.code = code email_record.email = email email_record.send_type = send_type email_record.save() email_title = '' email_body = '' if send_type == 'register': email_title = '注册激活链接' email_body = '请点击链接激活你的账号:http://127.0.0.1:8000/active/{0}'.format(code) send_status = send_mail(email_title, email_body, EMAIL_FROM, [email]) # 发送邮件 if send_status: pass elif send_type == 'forget': email_title = '密码重置链接' email_body = '请点击链接重置你的密码:http://127.0.0.1:8000/reset/{0}'.format(code) send_status = send_mail(email_title, email_body, EMAIL_FROM, [email]) # 发送邮件 if send_status: pass
3、实现重置密码views.py
from django.shortcuts import render from django.views.generic.base import View from django.contrib.auth.hashers import make_password # 对密码加密模块 from .models import UserProfile, EmailVerifyRecord from .forms import ForgetForm, ModifyPwdForm from users.utils.email_send import send_register_email class ForgetPwdView(View): def get(self, request): forget_form = ForgetForm() return render(request, 'forgetpwd.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, 'forgetpwd.html', {'forget_form': forget_form}) class ResetView(View): """密码找回的View""" def get(self, request, active_code): all_records = EmailVerifyRecord.objects.filter(code=active_code) if all_records: for record in all_records: email = record.email return render(request, "password_reset.html", {'email': email}) #跳转到修改密码页面 else: # active_fail.html在templates中新建的一个文件body中就一个<p>链接失效!</p> return render(request, "active_fail.html", {}) return render(request, "login.html", {}) class ModifyPwdView(View): """密码重置""" def post(self, request): modify_form = ModifyPwdForm(request.POST) if modify_form.is_valid(): pwd1 = request.POST.get('password1', '') pwd2 = request.POST.get('password2', '') email = request.POST.get('email', '') if pwd1 != pwd2: return render(request, "password_reset.html", {'email': email, 'msg':'密码不一致'}) user = UserProfile.objects.get(email=email) user.password = make_password(pwd2) user.save() return render(request, "login.html", {}) else: email = request.POST.get('email', '') return render(request, "password_reset.html", {'email': email, 'msg': modify_form})
4、urls.py
from users.views import ForgetPwdView, ResetView, ModifyPwdView urlpatterns = [ url(r'^forget/$', ForgetPwdView.as_view(), name='forget_pwd'), # 忘记密码链接 url(r'^reset/(?P<active_code>.*)/$', ResetView.as_view(), name='reset_pwd'), # 重置密码链接 url(r'^modify_pwd/$', ModifyPwdView.as_view(), name='modify_pwd'), # 重置密码链接 ]
5、html页面修改