zoukankan      html  css  js  c++  java
  • 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>
    
    
        <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

    <!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>
    
    
        <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:

    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' %}">忘记密码</a>),就可以完成通过邮箱找回密码的功能啦!

    5.send_register_email()方法及其配置 详见上一篇博客

  • 相关阅读:
    【转】最奇特的编程语言特征
    【原】mysql 视图
    自己动手写ORM框架(一):目标效果预览
    (二)Javascript面向对象:命名空间
    在JAVA中封装JSONUtils工具类及使用(一)
    .NET3.5中JSON用法以及封装JsonUtils工具类(二)
    (四)Javascript面向对象:继承
    自己动手写ORM框架(三):关系映射配置—Table属性
    (一)javascript面向对象:(2)类
    自己动手写ORM框架(二):AdoHelper支持多数据库操作的封装(1)
  • 原文地址:https://www.cnblogs.com/xuepangzi/p/8847090.html
Copyright © 2011-2022 走看看