这两天端午节。趁着端午节没事干,写了个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. MVC过滤器详解和示例

    原文  http://blog.csdn.net/ankeyuan/article/details/29624005 MVC过滤器一共分为四个:ActionFilter(方法过滤器),ResultFi ...

  2. table行转列

    table行转列 摘要 在使用ews调用exhange的收件箱的并在h5页面显示邮件详情的时候,因为返回的每封邮件的内容都是htmlbody,没有textbody.每封邮件又没什么规律,用正则表达式来 ...

  3. DAO 基础学习笔记

    一.DAO 1.概念: (1)Date Access Object(数据存取对象) (2)位于业务逻辑和持久化数据之间 (3)实现对持久化数据的访问 (4)类---> DAO --->数据 ...

  4. form 练习

    <form>姓:<input type="text" name="firstname" /><br />名:<inpu ...

  5. sgu Kalevich Strikes Back

    这道题就是求一个大矩形被n个矩形划分成n+1个部分的面积,这些矩形之间不会相交,可能包含.. #include <cstdio> #include <cstring> #inc ...

  6. 2015第15周日PostgreSQL学习

    英文版官网地址:http://www.postgresql.org/ 上面显示的最新版本信息是PostgreSQL 9.4.1, 9.3.6, 9.2.10, 9.1.15 & 9.0.19 ...

  7. margin:0 auto 与 text-align:center 的区别(转载)

    摘自:http://www.cnblogs.com/zhwl/p/3529473.html 基本概念: 1.text-align: 属性规定元素中的文本的水平对齐方式;   该属性通过指定行框与哪个点 ...

  8. GIT入门篇-基本概念与操作

    GIT 首先必须说明的是, 这篇文章不是阐述GIT原理性和比较深入的文章.只是对于日常开发中比较常用的需求的总结和GIT这些命令大体的原理解释.所以掌握这个只能说能够应付一定的开发需求.但是如果你是个 ...

  9. [Linux] killall 、kill 、pkill 命令详解

    killall 命令 Linux系统中的killall命令用于杀死指定名字的进程(kill processes by name).我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀 ...

  10. linux时钟管理

    ref https://access.redhat.com/solutions/18627 在el5中 如何查看系统现在使用的clock source是什么? 答: 方式1:需要说明的是不能保证这个两 ...