python模块itsdangerous简单介绍

安装

你可以从PyPI上直接安装这个库:

pip install itsdangerous

适用案例

在取消订阅某个通讯时,你可以在URL里序列化并且签名一个用户的ID。这种情况下你不需要生成一个一次性的token并把它们存到数据库中。在任何的激活账户的链接或类似的情形下,同样适用。
被签名的对象可以被存入cookie中或其他不可信来源,这意味着你不需要在服务端保存session,这样可以降低数据库读取的次数。
通常签名后的信息可以安全地往返与服务端与客户端之间,这个特性可以用于将服务端的状态传递到客户端再传递回来。

签名接口

最基本的接口是签名接口。 Signer 类可以用来将一个签名附加到指定的字符串上:

>>> from itsdangerous import Signer
>>> s = Signer('secret-key')
>>> s.sign('my string')
'my string.wh6tMHxLgJqB6oY1uT73iMlyrOA'

签名会被加在字符串尾部,中间由句号 (.)分隔。验证字符串,使用 unsign() 方法:

>>> s.unsign('my string.wh6tMHxLgJqB6oY1uT73iMlyrOA')
'my string'

如果被签名的是一个unicode字符串,那么它将隐式地被转换成utf-8。然而,在反签名时,你没法知道它原来是unicode还是字节串。
如果反签名失败了,将得到一个异常:

>>> s.unsign('my string.wh6tMHxLgJqB6oY1uT73iMlyrOX')
Traceback (most recent call last):
  ...
itsdangerous.BadSignature: Signature "wh6tMHxLgJqB6oY1uT73iMlyrOX" does not match

使用时间戳签名

如果你想要可以过期的签名,可以使用 TimestampSigner 类,它会加入时间戳信息并签名。在反签名时,你可以验证时间戳有没有过期:

>>> s = TimestampSigner('secret-key')
>>> string = s.sign('foo')
>>> s.unsign(string, max_age=5)
Traceback (most recent call last):
  ...
itsdangerous.SignatureExpired: Signature age 15 > 5 seconds</pre>

序列化

因为字符串难以处理,本模块也提供了一个与json或pickle类似的序列化接口。(它内部默认使用simplejson,但是可以通过子类进行修改)
:class:Serializer类实现了:

>>> from itsdangerous import Serializer
>>> s = Serializer('secret-key')
>>> s.dumps([1, 2, 3, 4])
'[1, 2, 3, 4].r7R9RhGgDPvvWl3iNzLuIIfELmo'

它当然也可以加载数据:

>>> s.loads('[1, 2, 3, 4].r7R9RhGgDPvvWl3iNzLuIIfELmo')
[1, 2, 3, 4]

如果你想要带一个时间戳,你可以用 TimedSerializer 类。
URL安全序列化
如果能够向只有字符受限的环境中传递可信的字符串的话,将十分有用。因此,itsdangerous也提供了一个URL安全序列化工具:

>>> from itsdangerous import URLSafeSerializer
>>> s = URLSafeSerializer('secret-key')
>>> s.dumps([1, 2, 3, 4])
'WzEsMiwzLDRd.wSPHqC0gR7VUqivlSukJ0IeTDgo'
>>> s.loads('WzEsMiwzLDRd.wSPHqC0gR7VUqivlSukJ0IeTDgo')
[1, 2, 3, 4]

JSON Web 签名

从“itsdangerous” 0.18版本开始,也支持了JSON Web签名。它们的工作方式与原有的URL安全序列化器差不多,但是会根据当前JSON Web签名

>>> from itsdangerous import JSONWebSignatureSerializer
>>> s = JSONWebSignatureSerializer('secret-key')
>>> s.dumps({'x': 42})
'eyJhbGciOiJIUzI1NiJ9.eyJ4Ijo0Mn0.ZdTn1YyGz9Yx5B5wNpWRL221G1WpVE5fPCPKNuc6UAo'

在将值加载回来时,默认会像其他序列化器一样,不会返回header。但是你可以通过传入 return_header=True 参数来得到header。

>>> s.dumps(0, header_fields={'v': 1})
'eyJhbGciOiJIUzI1NiIsInYiOjF9.MA.wT-RZI9YU06R919VBdAfTLn82_iIQD70J_j-3F4z_aM'
>>> s.loads('eyJhbGciOiJIUzI1NiIsInYiOjF9.MA.wT-RZI9YU06R919VBdAf'
...         'TLn82_iIQD70J_j-3F4z_aM', return_header=True)
...
(0, {u'alg': u'HS256', u'v': 1})

例:

from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from django.conf import settings

serializer = Serializer(秘钥, 有效期秒)

serializer = Serializer(settings.SECRET_KEY, 300)

serializer.dumps(数据), 返回bytes类型

token = serializer.dumps({'mobile': '18512345678'})
token = token.decode()

检验token 验证失败,会抛出itsdangerous.BadData异常

serializer = Serializer(settings.SECRET_KEY, 300)
try:
    data = serializer.loads(token)
except BadData:
    return None

到此这篇关于python模块itsdangerous简介的文章就介绍到这了,更多相关python模块itsdangerous简介内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python使用tkinter模块实现文件选择功能

    目录 前言 1.导入库和模块 2.编写按钮命令 3. 窗体初始化及布局 4.运行 前言 学习Python中,总想做个图形界面,找来找去,找到了tkinter. 练习内容:图形界面中,点击按钮后,利用弹出对话框选择文件(或文件夹) 1.导入库和模块 import tkinter as tk from tkinter import filedialog 此处练习过程中出现的错误:在没有第2个导入语句时,使用 tk.filedialog 后,提示错误,显示 Cannot find reference

  • python itsdangerous模块的具体使用方法

    itsdangerous 简介 有时您只想将一些数据发送到不受信任的环境.但是如何安全地做到这一点?诀窍就是签名.只要知道一个密钥,您就可以对数据进行加密签名并将其移交给其他人.当您取回数据时,可以轻松确保没有人篡改数据.使用itsdangerous可以实现此种方案. 安装 pip install itsdangerous 使用实例一 import itsdangerous salt='sdaf'#加盐 t=itsdangerous.TimedJSONWebSignatureSerializer

  • python模块itsdangerous简单介绍

    安装 你可以从PyPI上直接安装这个库: pip install itsdangerous 适用案例 在取消订阅某个通讯时,你可以在URL里序列化并且签名一个用户的ID.这种情况下你不需要生成一个一次性的token并把它们存到数据库中.在任何的激活账户的链接或类似的情形下,同样适用.被签名的对象可以被存入cookie中或其他不可信来源,这意味着你不需要在服务端保存session,这样可以降低数据库读取的次数.通常签名后的信息可以安全地往返与服务端与客户端之间,这个特性可以用于将服务端的状态传递到

  • Python 模块EasyGui详细介绍

    Python 模块EasyGui详细介绍 前言: 在Windows想用Python开发一些简单的界面,所以找到了很容易上手的EasyGui库.下面就分享一下简单的使用吧. 参考的链接:官网Tutorial 接下来,我将从简单,到复杂一点点的演示如何使用这个模块.希望能给刚接触easygui的你一点帮助 :-) msgBox,ccbox,ynbox # coding:utf-8 # __author__ = 'Mark sinoberg' # __date__ = '2016/5/25' # __

  • node.js中http模块和url模块的简单介绍

    前言 本文主要给大家介绍了关于node.js中http模块与url模块的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.http模块的简单介绍 node.js当中的http内置模块可以用于创建http服务器与http客户端. 1.引包 const http = require('http'); 2.创建http服务器 var server = http.createServer((req,res)=>{ }); 使用http的.createServer()方法可以

  • python kmeans聚类简单介绍和实现代码

    一.k均值聚类的简单介绍 假设样本分为c类,每个类均存在一个中心点,通过随机生成c个中心点进行迭代,计算每个样本点到类中心的距离(可以自定义.常用的是欧式距离) 将该样本点归入到最短距离所在的类,重新计算聚类中心,进行下次的重新划分样本,最终类中心不改变时,聚类完成 二.伪代码   三.python代码实现   #!/usr/bin/env python # coding=utf-8 import numpy as np import random import matplotlib.pyplo

  • Python模块学习 datetime介绍

    相比于time模块,datetime模块的接口则更直观.更容易调用.今天就来讲讲datetime模块. datetime模块定义了两个常量:datetime.MINYEAR和datetime.MAXYEAR,分别表示datetime所能表示的最小.最大年份.其中,MINYEAR = 1,MAXYEAR = 9999.(对于偶等玩家,这个范围已经足够用矣~~) datetime模块定义了下面这几个类: •datetime.date:表示日期的类.常用的属性有year, month, day: •d

  • Python模块搜索概念介绍及模块安装方法介绍

    [import模块] 和C中的#include不同,Python中的import语句并不是简单的把一个文件插入另外一个文件. 导入其实是运行时的运算,程序第一次导入指定文件时,会执行以下步骤, 1. 找到模块文件 2. 编译成位码 3. 执行模块中的代码来创建所定义的模块 并生成.pyc字节码文件,这三个步骤只在程序执行时,模块第一次导入时会进行.之后导入相同的模块时,会跳过这三个步骤,而只提取内存中已加载的模块对象,速度要快的多. NOTE: 1. Python把已加载的模块放在内置的sys.

  • Python Pandas数据结构简单介绍

    Series Series 类似一维数组,由一组数据及一组相关数据标签组成.使用pandas的Series类即可创建. import pandas as pd s1 = pd.Series(['a', 'b', 'c,', 'd']) print(s1) #输出: 0 a # 1 b # 2 c # 3 d # dtype: object 上面是传入一个列表实现,上面的0,1,2,3就是数据的默认标签.另外可以通过index属性自定义标签. s2 = pd.Series(['1', '2', '

  • Python多线程编程简单介绍

    创建线程 格式如下 复制代码 代码如下: threading.Thread(group=None, target=None, name=None, args=(), kwargs={}) 这个构造器必须用关键字传参调用 - group 线程组 - target 执行方法 - name 线程名字 - args target执行的元组参数 - kwargs target执行的字典参数 Thread对象函数 函数 描述 start() 开始线程的执行 run() 定义线程的功能的函数(一般会被子类重写

  • node.js中debug模块的简单介绍与使用

    前言 相信使用node.js的朋友们都知道,一般在nodejs需要进行调试的时候,可以使用console.log()方法来将调试信息输出到控制台,当发布到生产环境的时候,需要将这些调试信息都注释掉,为了方便切换而不需要改动程序代码,可以使用nodejs的debug模块 var debug = require('debug')('myapp:main'); debug('现在的时间是 %s' , new Date()); 如果是开发环境,只需要设置环境变量 这样就可以输出调试信息 如果需要关闭调试

  • python命名空间(namespace)简单介绍

    命名空间: 每一个作用域变量存储的位置,或者解释为 存储作用域中变量的字典. 作用: 获取想查看某个作用域中的变量名.变量值. 使用方法: locals() #当前命名空间 1. 效果图: 2. 代码 a=10 b=20 # 定义一个变量接收全局命名空间里的变量名.变量值 global_namespace=locals() print(global_namespace) print('\n\n\n') def one(): c=30 d=40 # 定义一个变量接收局部命名空间里的变量名.变量值

随机推荐