Django打造在线教育平台_day_4: 找回密码

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页面修改

原文地址:https://www.cnblogs.com/jp-mao/p/7077158.html