生成激活用户token(使用加密) : django开发之天天生鲜项目知识总结【3】

下面来进行分析,给用户发送,激活邮件,需要如何构成一条激活链接:

  • 发送激活邮件,包含激活链接:http://127.0.0.1:8000/user/active/1(1就是注册的用户id,可以通过id号进行用户身份的判断)
  • 激活链接中需要包含用户的身份信息:并且要将身份信息加密(防止某些人看穿规律,肆意伪造链接访问)

下面进行加密。需要导入一个模块:

在这里插入图片描述

下面进行安装:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple itsdangerous
  • 接着导入该类:
# 导入用来实现加密的类
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
  • 在终端演示一下如何使用:
Python 3.6.8 (default, Oct  7 2019, 12:59:55) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
>>> serializer = Serializer('secretkey', 3600)  # 创建实例对象,第一个参数随便指定的秘钥, 第二个参数是秘钥过期时间, 以秒为单位
>>> info = {'confirm': 1}     # 这里定义一个数据进行加密验证 
>>> res = serializer.dumps(info)    # 加密
>>> res
b'eyJhbGciOiJIUzUxMiIsImlhdCI6MTU3NDQyMTkwNiwiZXhwIjoxNTc0NDI1NTA2fQ.eyJjb25maXJtIjoxfQ.QFNkET46NVy-Orlaq7GVkJKKPMhoB6791--ueEZ1k8DjSMJuEMKS236a4SmZ3cqAEbkMjeE7mC96ih_eFh05BA'    # 加密结果。bytes类型的数据 
>>> serializer.loads(res)   # 这里是进行解密 
{'confirm': 1}
>>> 
>>> serializer = Serializer('secretkey', 5)
>>> info = {'confirm': 1}
>>> res = serializer.dumps(info)
>>> serializer.loads(res)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/huangdonglin/.virtualenvs/django_py3/lib/python3.6/site-packages/itsdangerous/jws.py", line 205, in loads
    date_signed=self.get_issue_date(header),
itsdangerous.exc.SignatureExpired: Signature expired    # 秘钥超时就会报这个错误
>>> 

下面可以看天天生鲜实例

# 在 settings文件里面,可以导入其中的一个常量,作为秘钥,所以需要导入 settings.py 文件
# 这个值是django内置的一个东西,可以拿来当做秘钥
# SECRET_KEY = 'hgr%i_sdyuse3dw)6&nnvv-9!djbt3%f#dknm$gn+&sv02njxp'


from django.conf import settings

# 加密用户的身份信息,生成激活的token
        serializer = Serializer(settings.SECRET_KEY, 3600)
        info = {'confirm': user.id}      # user 就是我获取的用户信息
        token = serializer.dumps(info)   # 显示的是 b'' 类型数据, 也就是 bytes类型数据,我们把它转换为字符串
        token = token.decode()   # 默认按照utf-8进行解码,变成字符串,这样才能变成一个参数,放到设置的激活链接后面而不会报错。

之后成功接收到链接之后,我们提取到加密之后的token,就需要对它解密,获得它的真实值(id)。

# 因为我们需要解码。可能出现秘钥过期报错,这里导入异常类,捕获异常
from itsdangerous import SignatureExpired  # 异常捕获


#这里给出我的处理 激活链接的类视图
class ActiveView(View):
    """用户激活"""
    def get(self, request, token):
        """进行用户激活"""
        # 进行解密,获取要激活用户的信息
        serializer = Serializer(settings.SECRET_KEY, 3600)
        try:
            info = serializer.loads(token)
            user_id = info.get('confirm')
            print(user_id,"++++++++++++++++++++++++++++++++" )
            # 根据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("激活链接以过期")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值