django 从零开始 11 根据时间戳加密数据
django自带一个加密的方法signer,对数据进行一个加密
一般这种方式用于账号密码邮箱找回,或者token设置
class TimestampSigner(Signer):
def timestamp(self):
return baseconv.base62.encode(int(time.time()))
def sign(self, value):
value = '%s%s%s' % (value, self.sep, self.timestamp())
return super().sign(value)
def unsign(self, value, max_age=None):
"""
Retrieve original value and check it wasn't signed more
than max_age seconds ago.
"""
result = super().unsign(value)
value, timestamp = result.rsplit(self.sep, 1)
timestamp = baseconv.base62.decode(timestamp)
if max_age is not None:
if isinstance(max_age, datetime.timedelta):
max_age = max_age.total_seconds()
# Check timestamp is not older than max_age
age = time.time() - timestamp
if age > max_age:
raise SignatureExpired(
'Signature age %s > %s seconds' % (age, max_age))
return value
这是django文档中的源码 ,可以看到是继承自signer类的,其中sign函数是对输入的数据加上当前时间戳进行一个加密
unsign则是验证加密数据是否过时,得到传入加密数据的时间戳,对函数中max_age时间转换为时间格式对比,如果当前时间减去加密数据的时间大于设置的规定时间,则抛出异常,不然返回正确的值
但是有个大问题,就是 加密数据会显示出来 比如加密数据{'name':'小明'} 会显示为' {'name':'小明'}:fszfdfyhYRTCFVDRSVG15R1X32B' 这种明显不行
后来在网上查找 发现sign类中含有序列化进行一个加密 并且可以添加对时间的控制

其实就是将上面的 TimestampSigner 类的时间戳加密弄过来了 返回一串加密字符 其中默认使用当时时间戳进行时间认证 不像flask在进行加密时可以确认过期时间 相反

可以保存到cookies中,进下一个页面需要验证使用这个验证(ps在这cookies卡了好久,我还以为咋cookeis没传过去,一直是空的 原来需要HttpResponse设置...)
解密sign 值
同样也是 TimestampSigner 的时间戳解密 源码如下

key和sigin加密一样默认不设置,先以简单为主
其中有一个参数max_age(用来对比时间) unsign解密源码

比如你是在1点10分进行一个加密,加密sign数值中含有1点10分的时间,使用unsign解密 输入max_age=60 数值为秒 不设置则为永久存在
解密过程中对比 将时间格式化 当前解密时的时间 减去 加密的时间 得到相减的时间 如果大于设置过期时间 抛出异常 不然返回解密值
所以我的代码是
加密
from datetime import datetime
from django.core import signing def set_sign(request): value = signing.dumps({'user':1254,'name':'xiaoming小明'})
print(value) request.COOKIES['sign'] = value
req = HttpResponse('获取sign值成功')
req.set_cookie('sign',value) return req
解密
def get_sign(request):
value = request.COOKIES.get('sign')
print(value)
s = '没有获取到sign'
if value:
try:
s = signing.loads(value,max_age=20) # 设置过期时间
print(s,datetime.now())
print(type(s)) # 加密时什么格式 返回什么格式
except:
print('sign过期',datetime.now())
s = 'sign过期'
return HttpResponse(s)
结果

获取不过期的sign 并得到结果 传入dict得到dict

对比设置解密时间过期 结果

设置的20秒过期 设置sign时间为20:42:23 获取sign的时间为20:43:38 哪怕能获取到sign值,也会解密错误
django 从零开始 11 根据时间戳加密数据的更多相关文章
- xadmin在Django 1.11中的使用及中英文切换
版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com xadmin是一个强大的替代django admin的管理后台,github地址为:https://g ...
- angular 4 和django 1.11.1 前后端交互 总结
首先 angular4 和django 1.11.1交互 有跨域问题 所以先关闭cors 和csrf验证 一.解决跨域问题 cors github django-cors-headers 1)安装co ...
- django第11天(分页器)
django第11天分页器 分页模块 批量插入数据 book_list = [] #先生成对象 for i in range(100): book = Book(name = 'book%s'%i,p ...
- Ubuntu 16.04 安装 Django==1.11.8
vim InStall-Django.sh #!/bin/bash rm -rf /usr/bin/python ln -s /usr/bin/python3 /usr/bin/python mkd ...
- Django框架11 /form组件、modelForm组件
Django框架11 /form组件.modelForm组件 目录 Django框架11 /form组件.modelForm组件 1. form组件介绍 2. form常用字段与插件 3. form所 ...
- django 1.11.16之环境搭建
django版本:django1.11.16 windows环境 python 3.6.3 !!!可先安装虚拟环境在进行环境搭建 1.安装django:pip install django= ...
- Django 1.11 release note简明解读
1.首先1.11这个版本是一个LTS版本 2.第一个支持python3.6的版本,最后一个支持python2.*的版本 3.Deprecating warnings 默认不再显示,同时建议第三方包开始 ...
- 我希望知道的关于Django的11件事(转)
英文原文:https://medium.com/cs-math/f29f6080c131 译文:http://my.oschina.net/chenlei123/blog/270672 两年前, 我开 ...
- django学习-11.开发一个简单的醉得意菜单和人均支付金额查询页面
1.前言 刚好最近跟技术部门的[产品人员+UI人员+测试人员],组成了一桌可以去公司楼下醉得意餐厅吃饭的小team. 所以为了实现这些主要点餐功能: 提高每天中午点餐效率,把点餐时间由20分钟优化为1 ...
随机推荐
- Leetcode13_罗马数字转整数
题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1. ...
- Jump Game (Medium)
主要有两种思路: 一. 本题只需要判断能否到达最后一个数,那么可以采用贪心策略,到达某个位置i后,在直接在这个位置的基础上走nums[i]步,主要保证能一直前进,就能达到终点: 那么,什么时候才不能一 ...
- 蓝桥杯-PREV31-小朋友排队
解法: 这题有点像冒泡排序,但是做这题并不需要冒泡排序. 假设第i个小朋友比第j个小朋友高,而且i < j 为了把队伍排成从小到大,第i个小朋友一定要去第j个小朋友的右边.又因为只能交换位置相邻 ...
- Qt 多线程QThread实现方法之一
基本思想 在主线程中,哪里需用多线程,就在哪里创建一个QThread实例: 把耗时操作封装到一个继承于QObject的子类(这里叫做工作类Worker)槽函数中: 创建QThread实例和Worker ...
- Qt unsigned char *与QString之间的相互转换
//unsiged char *转QString unsigned char *str = "fdd" ; char *str1 = (char *)str; QString s ...
- echo追加和覆盖
追加: echo " " >> 文件名 覆盖: echo " " > 文件名
- SpringBoot:三十五道SpringBoot面试题及答案
SpringBoot面试前言今天博主将为大家分享三十五道SpringBoot面试题及答案,不喜勿喷,如有异议欢迎讨论! Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一 ...
- leetcode简单题6
今天的华师 Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, fro ...
- 维生素D补充过多会中毒
虽然我们的物质生活越来越丰富,各种食材几乎一年四季都能够吃到,然而却越来越多的人选择进行补充各种维生素,但是你知道吗?维生素不是我们想象中多吃无害的,补充过多也会要人命,特别是最近非常流行补充的一种维 ...
- python——pymysql的安装
pymysql是python程序连接mysql数据库的的第三方库,通过运行import pymysql 查看系统中是否有该模块,没有的话需要自行安装. 安装教程如下: 1.下载pymysql安装包,下 ...