首先安装包
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple itsdangerous
//或
pip install itsdangerous
在使用时导入类
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from itsdangerous import SignatureExpired
# 在 settings文件里面,可以导入其中的一个常量,作为秘钥,所以需要导入 settings.py 文件
# 这个值是django内置的一个东西,可以拿来当做秘钥
# # SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '-=kx9*n=4$y2%e)9_w-!k*_xzy_#@)e50$*4r@k(6j0f@a@=ap'
from django.conf import settings
# 加密用户的身份信息,生成激活的token
# 创建序列化对象,Serializer(私钥, 生命周期(秒))
serializer = Serializer(settings.SECRET_KEY, 3600)
info = {'confirm': user.id} # user 就是我获取的需要加密的用户信息
token = serializer.dumps(info) # 显示的是 b'' 类型数据, 也就是 bytes类型数据,我们把它转换为字符串
# 通过序列化器dumps方法进行加密.dumps里传的是键值对 是二进制
token = token.decode() # 默认按照utf-8进行解码,变成字符串,这样才能变成一个参数,放到设置的激活链接后面而不会报错。
# 发邮件,放到celery_tasks.task.py里进行异步处理,这里进行调用
# subject = '天天生鲜欢迎信息'
# message = ''
# sender = settings.EMAIL_FROM
# receiver = [email]
# html_message = '<h1>%s, 欢迎您成为天天生鲜的注册会员</h1>请点击下面的链接激活您的账户<br/> <a href="http://127.0.0.1:8000/user/active/%s">http://127.0.0.1:8000/user/active/%s</a>'%(username, token, token)
# # 邮件内容中有html标签时需要用html_message 避免标签被转义.
# send_mail(subject, message, sender, receiver,html_message=html_message)
# 这里是任务发出者
# 调用celery_tasks.task.py进行邮件发送,通过delay把任务放入到任务队列
send_register_active_email.delay(email, username, token) # email在tasks里定义参数为to_email
# 返回应答,跳转到首页
return redirect(reverse('goods:index'))
接收到链接之后,我们提取到加密之后的token,就需要对它解密,获得它的真实值(id)
class ActiveView(View):
'''用户激活'''
def get(self, request, token):
'''进行用户激活'''
# 必须和加密时使用的密钥相同
serializer = Serializer(settings.SECRET_KEY, 3600)
try:
info = serializer.loads(token) # 解密
# 获取待激活用户的id
user_id = info['confirm'] #dumps里传的是键值对 是二进制,这里通过键获取值
# 根据id获取用户信息
user = User.objects.get(id=user_id)
user.is_active = 1
user.save()
# 跳转到登录页面
return redirect(reverse('user:login'))
except SignatureExpired as e:
# 激活链接已实效
return HttpResponse('激活链接已过期')
# 实际项目中,若已过期会返回一个页面,告诉已过期,并且点击链接会重新发送邮件