zoukankan      html  css  js  c++  java
  • django-签名加密模块It's dangerous--加密token

    https://juejin.im/entry/56b30250df0eea0054375e1d

    安装

    pip install itsdangerous

     使用

    from itsdangerous import TimedJSONWebSignatureSerializer as Serializer # 导入itsdangerous里面的类 实现加密
    from django.conf import settings
    
    # 创建序列化对象
    # Serializer(私钥, 生命周期(秒))
    # serializer = Serializer('secretkey', 3600)  # 私钥不能公开,不然就能被篡改 可以借助django里setting.py配置文件中的SECRET_KEY
    serializer = Serializer(settings.SECRET_KEY, 3600)
    info =  {'confirm':1}
    # 通过序列化器dumps方法进行加密
    data = serializer.dumps(info)  # dumps里传的是键值对 是二进制
    # 编码
    data = data.decode('utf-8')
    print(data)
    
    # 解密
    res = serializer.loads(data)
    print(res)

     实例user/views.py

    from django.shortcuts import render, redirect
    from django.http import HttpResponse, JsonResponse
    from django.core.urlresolvers import reverse  # 反响解析
    from django.views.generic import View  # 导入类试图
    from django.conf import settings  # 导入配置文件 获取私钥
    from itsdangerous import TimedJSONWebSignatureSerializer as Serializer # 导入itsdangerous里面的类 实现加密
    
    import re
    from user.models import *
    # Create your views here.
    
    class RegisterView(View):
        '''注册'''
        def get(self, request):
            '''显示注册页面'''
            return render(request, 'register.html')
    
        def post(self, request):
            '''进行注册处理'''
            # 接受数据
            username = request.POST.get('user_name')
            password = request.POST.get('pwd')
            email = request.POST.get('email')
            allow = request.POST.get('allow')
            # 校验
            # 数据完整度
            if not all([username, password, email]):
                return render(request, 'register.html', {'errmsg': '数据不完整'})
            # 邮箱验证
            if not re.match(r'^[A-Za-z0-9u4e00-u9fa5]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$', email):
                return render(request, 'register.html', {'errmsg': '邮箱格式不正确'})
            # 校验协议
            if allow != 'on':
                return render(request, 'register.html', {'errmsg': '请同意协议'})
            # 校验用户是否存在
            try:
                user = User.objects.get(username=username)
            except Exception as e:
                user = None
            if user:
                # 用户已存在
                return render(request, 'register.html', {'errmsg': '用户名已存在'})
    
            # 进行用户注册
            # create_user() 注册用户
            user = User.objects.create_user(username, email, password)
            user.is_active = 0  # 0为未激活状态
            user.save()
    
            # 进行token加密
            serializer = Serializer(settings.SECRET_KEY, 3600)
            info = {'confirm':user.id}
            token = serializer.dumps(info).decode('utf-8')
    
    
            return redirect(reverse('goods:index'))
    
    # 用户激活
    from itsdangerous import SignatureExpired  # 解密信息过期错误
    class ActiveView(View):
        def get(self, request, token):
            '''进行用户激活'''
            # 进行解密 获取要激活的用户信息
            serializer = Serializer(settings.SECRET_KEY, 3600)
            try:
                info = serializer.loads(token)
                # 获取待激活用户id
                user_id = info['confirm']
                
                # 根据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('激活链接已过期')
            
  • 相关阅读:
    Go语言基础之切片
    Go语言基础之map
    Go语言基础之函数
    Go语言基础之指针
    Go语言基础之结构体
    Redis缓存失效策略
    redis 的过期策略都有哪些?内存淘汰机制都有哪些?
    关于redis的主从、哨兵、集群
    Redis的 RDB和 AOF持久化的区别
    为什么做分布式使用 Redis
  • 原文地址:https://www.cnblogs.com/yifengs/p/11579684.html
Copyright © 2011-2022 走看看