这两天端午节。趁着端午节没事干,写了个flask的扩展——flask-RedisSession

在flask中使用该扩展可以让你借助redis数据库轻松获得server-side session.

这个flask扩展可以使用pip install flask-redissession获得,也可以进入flask-redissession给我个star 给我提问题/建议...

由于写这个扩展包的需要,我重新研究了一下flask中session的部分。以下部分是我扩展包中的过程。

open_session

当用户发送请求的时候,request被传到服务器。由于使用的是server-side session,这个request中就包含一个sessionID。后台程序调用open_session方法,来解析这个request,获得session。具体的过程如下:

  1. 后台程序解析request,通过session_cookie_name获得sessionID(如果没有,就设置为None)

  2. 检验这个sessionID是否存在。如果不存在,则生成一个sessionID,然后创建一个session,并返回给客户端

  3. sessionID存在。检验是否使用SECRET_KEY来签名。如果使用,则调用Signer函数生成Signer对象,并对这个sessionID进行unsigner操作。

    signer = Signer(app.secret_key, salt='flask-redis-session',
    key_derivation='hmac')
    sessionid = signer.unsign(sessionid).decode('utf-8')
  4. 根据unsigner操作获得的结果在redis数据库中查找对应的session(已序列化),并对session反序列化。如果根据sessionID没找到,则创建一个新的session并返回给客户端

  5. 把查找到的session返回给客户端

save_session

如果session发生改变,就会调用这个方法(先删除原session,再set_session)。

在save_session中,我们需要知道:

  1. 把session被序列化后的东西存入redis数据库:

    以下是序列化的代码

     serialize_session = self.serialization_method.dumps(dict(session))
  2. 需要在每次session发生改变的时候重置过期时间。

  3. 如果使用SECRET_KEY进行签名,则在给用户返回sessionID之前,需要对原sessionID进行签名:

    session_id = Signer(app.secret_key, salt='flask-redis-session',
    key_derivation='hmac').sign(session.session_id.encode('utf-8'))
    #对session_id进行解码,转为str
    session_id = session_id.decode('utf-8')
  4. 调用set_session为用户设置新的session。其中传输的值为签名后的sessionID

总结

  1. redis数据库使用字符串对象存储session。

    键:未签名的sessionID

    值:序列化的session
  2. 用户请求中(request)的sessionID是已签名sessionID,在服务器中需要unsign操作才能获得真正的sessionID
  3. 当session发生改变的时候,服务器需要在redis中删除原session,并调用delete_cookie让客户端删除这个session;然后向redis中写入新的session(需要序列化),并通过调用set_session把签名后的sessionID回传给客户端

Flask的session——关于写扩展所学习到的的更多相关文章

  1. FLASK 的Session和MoudelForm插件

    falsk是小而精的框架,但是热度高, 所有很多爱好者提供了很多扩展插件 功能强大,美而不足的就是兼容稳定性有时候不太好,不过大部分还是很可以的 Flask-Session flask内置sessio ...

  2. Python之美[从菜鸟到高手]--一步一步动手给Python写扩展(异常处理和引用计数)

    我们将继续一步一步动手给Python写扩展,通过上一篇我们学习了如何写扩展,本篇将介绍一些高级话题,如异常,引用计数问题等.强烈建议先看上一篇,Python之美[从菜鸟到高手]--一步一步动手给Pyt ...

  3. flask 的session

    python的flask操作设置.获得与删除session 首先讲一下Python的flask中session与cookies的关系,session是储存在服务器中的,cookies是储存在浏览器本地 ...

  4. c#写扩展方法

    学习MVC时,学会了写扩展方法,用起来很方便. 01 using System; 02 using System.Collections.Generic; 03 using System.Linq; ...

  5. Flask的session

    ### session:1. session的基本概念:session和cookie的作用有点类似,都是为了存储用户相关的信息.不同的是,cookie是存储在本地浏览器,session是一个思路.一个 ...

  6. Flask中session实现原理

    前言 flask_session是flask框架实现session功能的一个插件,用来替代flask自带的session实现机制,flask默认的session信息保存在cookie中,不够安全和灵活 ...

  7. Flask的session使用

    由于http是无状态保存的协议,session可以看作不同请求之间保存数据的一种机制.flask的session是基于cookie的会话保持. 流程 当客户端进行第一次请求的时候,客户端的HTTP r ...

  8. 第六篇 flask中session

    Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 Flask 中 session 的使用 1. Flask 中 session 是 ...

  9. Flask里面session的基本操作

    #session是依赖于flask的session模块 #如果想使用session模块,在配置里必须定义sessionkey from flask import Flask,session #建立对象 ...

随机推荐

  1. HBase架构深度解析

    原文出处: DLevin(@雪地脚印_) 前记 公司内部使用的是MapR版本的Hadoop生态系统,因而从MapR的官网看到了这篇文文章:An In-Depth Look at the HBase A ...

  2. C51汇编伪指令

    1.DS ---预留存储区命令格式: [标号:] DS   表达式值其功能是从指定地址开始,定义一个存储区,以备源程序使用.存储区预留的存储单元数由表达式的值决定. ;从标号TEP地址处开始保留1个存 ...

  3. PowerShell_零基础自学课程_2_Powershell与Cmd以及Unix/Linux Shell

    上篇文章我说道,windows为了改变用户对其console界面的诟病,于是就从windows   vista开始,计划要改变这种局面,于是就有 了Powershell的出现. 1.兼容shell命令 ...

  4. Friendly number

    Friendly number Long numbers can be made to look nicer, so let’s write some code to do just that. Yo ...

  5. Min and Max

    Min and Max 需要处理不同数据类型; 另外*args, 表示的是位置参数, *kwargs表示的是key参数, args的类型为tuple类型, 参数为min(3, 2)时, args为(3 ...

  6. 阻碍android程序员发展的几个原因

    1应该少看网上的android开发相关技术帖子,一个是错误很多,表达也不清楚,很多都是拷贝来拷贝去的.二个是技术变迁快,很多都过时了,经常看android技术相关帖子,养成了一种惰性,遇到问题不是去看 ...

  7. c++ 10

    一.二叉树 1.基本特征 1)树型结构的最简模型,每个节点最多有两个子节点--左子节点和右子节点. 2)单根性,每个子节点有且仅有一个父节点,整棵树有且仅有一个根节点. 3)递归性,以任何一个节点为根 ...

  8. 删除list中指定值的元素

    public class ListRemoveAll { public static void main(String[] args) {  // TODO Auto-generated method ...

  9. Non-negative Partial Sums(单调队列)

    Non-negative Partial Sums Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  10. python 弄github代码库列表

    1.底        项目要求,征求github的repo的api,为了能够提取repo对数据进行分析. 研究一天.最终克服该问题,較低下.     由于github的那个显示repo的api,列出了 ...