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,测试结果
收到密码邮件,登录的时候需要更新后的密码了
配置的邮箱有发送记录
参考过得博客
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