这两天端午节。趁着端午节没事干,写了个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. Pyhon之常用操作符 - 零基础入门学习Python006

    Pyhon之常用操作符 让编程改变世界 Change the world by program 今天我们来谈谈Python之常用操作符,在此之前的一些例子中,大家已经看到Python可以完成简单的算术 ...

  2. linux中查找命令find、locate、whereis、which、type区别

    linux中查找命令find.locate.whereis.which.type区别 1. find Java代码 find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件.与查询数据库(/ ...

  3. 执行yiic webapp命令时报错:php.exe不是内部或外部命令,也不是可运行的程序

    在执行 yiic webapp ../abc 命令时报错: “php.exe”不是内部或外部命令,也不是可运行的程序 或批处理文件. 这是因为yiic批处理程序找不到php.exe的执行路径引起的. ...

  4. (转)syslog日志等级

    设施.优先级”(facility.priority)设施(facility): kern 0 内核日志消息 user 1 随机的用户日志消息 mail 2 邮件系统日志消息 daemon 3 系统守护 ...

  5. Oracle查看表空间及修改数据文件大小

    Oracle查看表空间及修改数据文件大小 第一步:查看所有表空间及表空间大小: select tablespace_name ,sum(bytes) / 1024 / 1024 as MB from ...

  6. REDIS主从配置及切换

    最近公司项目也用上了.但有个点没有弄很明白. requirepass只是给CLIENT认证用的,还是同时给从REDIS认证用的?(masterauth) 一般的思路是主服务器不开AOF,从服务器打开A ...

  7. 商派shopex

    http://www.shopex.cn/48release/shopexsingle_exper.php 在线体验 前台体验:http://demo.shopex.com.cn/485 后台体验:h ...

  8. Find Median from Data Stream 解答

    Question Median is the middle value in an ordered integer list. If the size of the list is even, the ...

  9. 用WIFI为什么连不上VPN

    因为是做服务器的,经常需要通过VPN连接到公司的服务器处理一些事件. 但最近一次在寝室通过WIFI连接VPN时却报“错误 619:不能建立到远程计算机的连接,因用于此端口的连接已关闭”.我的第一反应是 ...

  10. jquery 鼠标图片经过效果

    <script> //鼠标图片经过效果 $(function(){ $(".jione_box ").css("background-color", ...