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 ...
随机推荐
- OpenAL介绍
OpenAL(Open Audio Library)是自由软件界的跨平台音效API,由Loki Software,使用在Windows.Linux 系统上,用在音效缓冲和收听中编码. OpenAL设计 ...
- django框架基础-django模板语言-长期维护
################## 常用的模板语言 ####################### # django的模板语言, # # 只需要记两种特殊符号: # # {{ } ...
- 接口测试 requests的身份认证方式
requests提供多种身份认证方式,包括基本身份认证.netrc 认证.摘要式身份认证.OAuth 1 认证.OAuth 2 与 OpenID 连接认证.自定义认证.这些认证方式的应用场景是什么呢? ...
- Windows Server 2012 R2 强制卸载域控制器
本次实验要演示的是强制卸载域控制器并且在其他域控制器上删除不需要的服务器对象,这种情况在现实的生产使用环境中经常使用,每个企业每年都会有增减域控制器的时候,而且在减少了域控制器之后,原本的域还会继续使 ...
- when|nobody|hazard|lane|circuit|
How can I help them they won't listen to me? 题目解析 考查从句.此句意为:如果他们要是不听我的话,我怎么帮助他们?此处,when引导的状语从句表示假设事 ...
- Python---5Python内置的有序集合-list和tuple
list Python内置的一种数据类型是列表:list,[ ].可以修改的集合. list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: ...
- 3名程序员被抓!开发“万能钥匙”APP,撬走3个亿
来自:程序员头条 报道 又有 3 名程序员被抓!开发"万能钥匙"APP,撬走 3 亿! 前几天,据央视新闻报道,上海公安机关接到共享单车企业报案,随后破获了一起共享单车万能解锁 A ...
- MySQL5.6 数据库主从(Master/Slave)同步安装与配置详解
.安装环境 .基本环境配置 .Master的配置 .Slave的配置 .添加需要同步的从库Slave .真正的测试 安装环境 1 操作系统 :CentOS 6.5 2 数据库版本:MySQL 5.6. ...
- Redis(2)——跳跃表
一.跳跃表简介 跳跃表(skiplist)是一种随机化的数据结构,由 William Pugh 在论文<Skip lists: a probabilistic alternative to ba ...
- C++与引用1
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...