Django发送邮件和itsdangerous模块的配合使用解析
作者:springionic 发布时间:2023-09-11 04:29:00
标签:django,发送,邮件,itsdangerous,模块
项目需求:用户注册页面注册之后,系统会发送一封邮件到用户邮箱,用户点击链接以激活账户,其中链接中的用户信息需要加密处理一下
其中激活自己邮箱的smtp服务的操作就不在加以说明,菜鸟教程上有非常清晰的讲解,也可以去网上搜索详细步骤
首先在Django项目的settings文件中配置发送邮件相关的配置如下:
# 固定写法
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# smtp服务器地址
EMAIL_HOST = 'smtp.qq.com'
# 固定端口号
EMAIL_PORT = 25
#发送邮件的邮箱
EMAIL_HOST_USER = '2746565701@qq.com'
#在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = 'ytnvwapcbxmcdfig'
#收件人看到的发件人,尖括号中的必须与上面的user一致
EMAIL_FROM = '天天生鲜<2746565701@qq.com>'
用户模块的views.py文件关于itsdangerous和邮件发送的代码如下,项目其它部分的操作代码这里全部删除,这里使用的是基于类的视图:
基本逻辑:
利用itsdangerous模块对链接中的用户信息加密,生成加密后的用户信息token;
调用Django发送邮件的相关方法,进行发送邮件(邮件的配置已经配置好);
邮件发送的链接中有一个可变参数,包含着用户id加密后的信息;
用户接收到邮件之后,点击链接,跳转到对应的视图类进行处理;
负责激活的视图类,解密用户的信息,获取用户id,查询到对应用户(在这个过程会判断被加密的信息是否超时);
将对应用户中数据库中用户表中 is_active 字段的值改为1,表示此用户被激活;
跳转到首页;
# 导入itsdangerous中要用到的加密类
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
# 导入itsdangerous中超时的异常
from itsdangerous import SignatureExpired
# 导入配置文件
from django.conf import settings
# 导入Django中的发送邮件的方法
from django.core.mail import send_mail
from .models import User
# Create your views here.
class RegisterView(View):
"""注册"""
....................
def post(self, request):
"""进行注册处理"""
# 发送激活邮件,包含一个激活的链接:https://127.0.0.1:8000/user/active/3
# 激活链接中需要包含用户的身份信息,并且要把身份信息进行加密
# 加密用户的身份信息,生成激活的token
serializer = Serializer(settings.SECRET_KEY, 3600) # 创建爱一个itsdangerous模块中加密类的对象,其中SECRET_KEY用settings中的,第二个参数为超时时间
info = {'confirm': user.id} # 被加密的信息,一个字典,字典值为接收邮件用户的id
# 利用dumps方法进行加密,加密后为bytes数据
token = serializer.dumps(info) # bytes数据
token = token.decode() # bytes转str
# 发邮件
subject = '天天生鲜欢迎信息' # 邮件主题
message = '' 邮件信息,因为有html__message了,所以这里为空就好
sender = settings.EMAIL_FROM # 发送者,直接从配置文件中导入上面配置的发送者
receiver = [email] # 接收者的邮箱,是一个列表,这里是前端用户注册时传过来的 email
# html结构的信息,其中包含了加密后的用户信息token
html_message = '<h1>{},欢迎您成为天天生鲜注册会员</h1>请点击下面链接激活您的用户<br><a href="http:127.0.0.1:8000/user/active/{}" rel="external nofollow" >http:127.0.0.1:8000/user/active/{}</a>'.format(username, token, token)
# 调用Django发送邮件的方法,这里传了5个参数
send_mail(subject, message, sender, receiver, html_message=html_message)
# 返回应答:跳转到首页
return redirect(reverse('goods:index'))
class ActiveView(View):
"""用户激活"""
def get(self, request, token):
"""进行用户激活"""
# 进行解密,获取要激活的用户信息
serializer = Serializer(settings.SECRET_KEY, 3600)
try:
# 通过itsdangerous模块的loads方法解密
info = serializer.loads(token)
# 获取待激活用户的id
user_id = info.get('confirm')
# 根据id获取用户信息
user = User.objects.get(id=user_id)
# 激活用户操作,将数据库中对应用户的is_active参数变为1
user.is_active = 1
user.save()
# 跳转到登录界面
return redirect(reverse('user:login'))
except SignatureExpired as e:
# 激活链接已经过期
return HttpResponse('激活链接已过期!')
来源:https://www.cnblogs.com/springionic/p/10926778.html


猜你喜欢
- 和网友们讨论了数组取交集的方法,下面是两个实现arr1=["1","5","6"
- 一、维数的变形1. 一维数组转二维数组以及同维变换import numpy as nparr_1d = np.arange(12)# 使用
- Mysql数据库是一个多用户,多线程的关系型数据库,是一个客户机/服务器结构的应用程序。它是对个人用户和商业用户是免费的. Mysql数据库
- 使用 pyecharts 渲染成图片一直是开发者比较关心的功能,pyecharts提供了 selenium、phantomjs 和 pypp
- 配置文件注释里面有写,懒得用配置文件了代码# 京东云无线路由宝推送import requestsimport jsonimport time
- 现在用MSSQL的地方太多了,有很多做技术的个人电脑上也安装SQL专业版,因为它用的多,但用的人都知道,SQL有个超级用户sa,此用户默认情
- 本文实例讲述了Python学习笔记之字符串和字符串方法。分享给大家供大家参考,具体如下:字符串在 python 中,字符串的变量类型显示为
- 前言kettle通过域名或者IP连接Oracle,本地不需要安装Oracle,但是要把Oracle的驱动jar包复制到kettle的lib目
- 入门scipy.optimize中,curve_fit函数可调用非线性最小二乘法进行函数拟合,例如,现在有一个高斯函数想要被拟合则调用方法如
- 前言这篇博客针对《PPython+Qt身体特征识别人数统计》编写代码,功能包括了相片,摄像头身体识别,数量统计。代码整洁,规则,易读。应用推
- length: 是计算字段的长度一个汉字是算三个字符,一个数字或字母算一个字符CHAR_LENGTH(str) 返回
- 其实老早之前就已经做完了,这次稍微改进一下浏览地址:http://www.healdream.com/upload/html/autocli
- 为了降低用户注册难度,国际站的主注册表单一直在改进。主注册三月至今发生了两次较大的变化,现在对表单调整的地方分解如下:1. 两步
- 本文实例为大家分享了Django1.11自带分页器Django的具体使用方法,供大家参考,具体内容如下接下来我编写一个 views ,名cl
- MySQL 出现错误1418 的原因分析及解决方法具体错误: 使用mysql创建、调用存储过程,函数以及触发器的时候会有错误符号为
- (一)wxpython的安装 Ubuntu下的安装,还是比较简单的。#使用:apt-cache sear
- 一.re模块的查找方法:1.findall 匹配所有每一项都是列表中的一个元素import reret = re.f
- 这篇文章主要介绍了Python如何使用函数做字典的值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 方法一:巧用sum函数将list列表与一个空列表相加,就能把嵌套列表合并成一个a=[[1],[2],[3],[4],[5]]merge=su
- 有时候写爬虫的时候需要将浏览器中的headers信息复制到Pycharm中使用,但是复制过来的格式不是需要的键值格式,挨个手动敲键盘太累,毕