首页 > 技术文章 > Django 忘记密码,通过邮箱重置密码

lgdafeng 2021-05-09 02:41 原文

1,模板
vim templates/forget_password.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>故事其实很短</title>
    <link rel="icon" href="/static/images/favicon.ico">
    <link href="/static/plugins/bootstrap-5.0.0-beta1-dist/css/bootstrap.min.css" rel="stylesheet">
    <link href="/static/css/master.css" rel="stylesheet">
</head>

<body>
    <form action="" method="post" class="forget-password-form">
        {% csrf_token %}
        <h4>Reset Password</h4>
        <input type="text" name="username" placeholder="Input Your Username" class="forget-password-input" />
        <input type="submit" value="RESET" class="login-button" />
        <span class="forget-password-tips">{{forget_password_tips}}</span>
        <a href="/login/" class="forget-password-tips">Return Login</a>
    </form>
</body>
</html>

 

2,视图函数
vim app01/views.py
from django.shortcuts import render,redirect
#from django.http import HttpResponse

from django.contrib import auth
from django.contrib.auth.models import User
#from django.contrib.auth.decorators import login_required
from django.conf import settings
from django.core.mail import send_mail
import random
import string
from django.contrib.auth.hashers import make_password

def forget_password(request):
    if request.method == "GET":
        return render(request, "forget_password.html")
    else:
        username = request.POST.get("username")
        count = User.objects.filter(username=username).count()
        if count == 1:
            email = User.objects.get(username=username).email
            email_part = email[3:]

            # generate password,length = 8, letters and digits
            random_password = ''.join(random.sample(string.ascii_letters + string.digits, 8))

            # update password, hash password
            password = make_password(random_password)
            User.objects.filter(username=username).update(password=password)

            # send email
            subject = "Password reset notification"
            message = "Your username " + username + " 's password is changed into " + random_password
            sender = settings.EMAIL_HOST_USER
            recipient = [email]
            send_mail(
                subject,
                message,
                sender,
                recipient
            )
            return render(request, "forget_password.html", {"forget_password_tips": "Password is sent to *****" + email_part + " , please check your inbox or junk box."})
        else:
            return render(request, "forget_password.html", {"forget_password_tips": username + " is not exsit!"})

 

3,视图函数代码分析,拆分步骤2的代码
1)判断用户名是否存在于数据库,如果存在,返回的记录1条, 或者使用exsit()
from django.contrib import auth
from django.contrib.auth.models import User


username = request.POST.get("username")
        count = User.objects.filter(username=username).count()
        if count == 1:

 

2)获取用户名username对应的邮箱地址
email = User.objects.get(username=username).email
email_part = email[3:]    #截取邮箱,在界面显示部分
 
3)生成随机密码,Python生成随机字母和数字混合,长度为8,(可以自行研究生成更复杂的密码)
import random
import string


random_password = ''.join(random.sample(string.ascii_letters + string.digits, 8))

 

4)更新密码,更新到MySQL的auth_user表,Django自带的生成hash加密密码 make_password
from django.contrib import auth
from django.contrib.auth.models import User
from django.contrib.auth.hashers import make_password


# update password, hash password
password = make_password(random_password)
User.objects.filter(username=username).update(password=password)

 

5) 发邮件模块
先在setting配置
vim HelloWorld/settings.py
 
网易使用EMAIL_USE_TLS , QQ邮箱使用EMAIL_USE_SSL
# send email by 163
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True
EMAIL_USE_SSL = False
EMAIL_HOST = 'smtp.163.com'
EMAIL_PORT = 25
EMAIL_HOST_USER = 'test@163.com'
EMAIL_HOST_PASSWORD = '163邮箱授权码'

 

view 代码块
 
from django.conf import settings
from django.core.mail import send_mail


# send email
subject = "Password reset notification"
message = "Your username " + username + " 's password is changed into " + random_password
sender = settings.EMAIL_HOST_USER
recipient = [email]
send_mail(
    subject,
    message,
    sender,
    recipient
)

 

4,测试结果
 
0
 
收到密码邮件,登录的时候需要更新后的密码了
 
0
 

 配置的邮箱有发送记录

 

 

 

 参考过得博客

https://www.cnblogs.com/ryxiong-blog/articles/10986867.html
https://www.cnblogs.com/huang-yc/p/9609314.html
https://www.cnblogs.com/sss4/p/7070942.html
https://www.jianshu.com/p/8c8763af7465
https://www.yisu.com/zixun/178846.html
https://blog.csdn.net/q3102885/article/details/83303415

 

 

推荐阅读