Flask的session——关于写扩展所学习到的
这两天端午节。趁着端午节没事干,写了个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。具体的过程如下:
后台程序解析request,通过
session_cookie_name获得sessionID(如果没有,就设置为None)检验这个
sessionID是否存在。如果不存在,则生成一个sessionID,然后创建一个session,并返回给客户端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')
根据unsigner操作获得的结果在redis数据库中查找对应的session(已序列化),并对session反序列化。如果根据sessionID没找到,则创建一个新的session并返回给客户端
把查找到的session返回给客户端
save_session
如果session发生改变,就会调用这个方法(先删除原session,再set_session)。
在save_session中,我们需要知道:
把session被序列化后的东西存入redis数据库:
以下是序列化的代码serialize_session = self.serialization_method.dumps(dict(session))
需要在每次session发生改变的时候重置过期时间。
如果使用
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')
调用
set_session为用户设置新的session。其中传输的值为签名后的sessionID
总结
- redis数据库使用字符串对象存储session。
键:未签名的sessionID
值:序列化的session - 用户请求中(request)的sessionID是已签名sessionID,在服务器中需要unsign操作才能获得真正的sessionID
- 当session发生改变的时候,服务器需要在redis中删除原session,并调用
delete_cookie让客户端删除这个session;然后向redis中写入新的session(需要序列化),并通过调用set_session把签名后的sessionID回传给客户端
Flask的session——关于写扩展所学习到的的更多相关文章
- FLASK 的Session和MoudelForm插件
falsk是小而精的框架,但是热度高, 所有很多爱好者提供了很多扩展插件 功能强大,美而不足的就是兼容稳定性有时候不太好,不过大部分还是很可以的 Flask-Session flask内置sessio ...
- Python之美[从菜鸟到高手]--一步一步动手给Python写扩展(异常处理和引用计数)
我们将继续一步一步动手给Python写扩展,通过上一篇我们学习了如何写扩展,本篇将介绍一些高级话题,如异常,引用计数问题等.强烈建议先看上一篇,Python之美[从菜鸟到高手]--一步一步动手给Pyt ...
- flask 的session
python的flask操作设置.获得与删除session 首先讲一下Python的flask中session与cookies的关系,session是储存在服务器中的,cookies是储存在浏览器本地 ...
- c#写扩展方法
学习MVC时,学会了写扩展方法,用起来很方便. 01 using System; 02 using System.Collections.Generic; 03 using System.Linq; ...
- Flask的session
### session:1. session的基本概念:session和cookie的作用有点类似,都是为了存储用户相关的信息.不同的是,cookie是存储在本地浏览器,session是一个思路.一个 ...
- Flask中session实现原理
前言 flask_session是flask框架实现session功能的一个插件,用来替代flask自带的session实现机制,flask默认的session信息保存在cookie中,不够安全和灵活 ...
- Flask的session使用
由于http是无状态保存的协议,session可以看作不同请求之间保存数据的一种机制.flask的session是基于cookie的会话保持. 流程 当客户端进行第一次请求的时候,客户端的HTTP r ...
- 第六篇 flask中session
Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 Flask 中 session 的使用 1. Flask 中 session 是 ...
- Flask里面session的基本操作
#session是依赖于flask的session模块 #如果想使用session模块,在配置里必须定义sessionkey from flask import Flask,session #建立对象 ...
随机推荐
- 关于Django模板渲染一个很重要的用途
一般情况下我们在模板利用django的for标签循环生成html代码时,可以同时生成形如: "{% url 'dormitory:hygiene_detail' pk={{ id }} %} ...
- 【好程序员笔记分享】——URL解码与编码
-iOS培训,iOS学习-------型技术博客.期待与您交流!------------ 1.url编码 ios中http请求遇到汉字的时候,需要转化成UTF-8,用到的方法是: NSString * ...
- ANSIC程序到KeilC51的移植心得
摘要:本文讲述了将ANSIC程序移植到KeilC51上应该注意的事项.文章讲述了存储类型.指针类型.重入函数.根据目标系统RAM的分布的段定位和仿真栈设置.函数指针.NULL指针问题.字节顺序.交叉汇 ...
- Android导航菜单横向左右滑动并和下方的控件实现联动
这个是美团网个人订单的效果,找了很多地方都没找到,自己研究了两天终于弄出来了^_^,有什么问题希望大家指出来,谢谢. 实现原理是上方使用HorizontalScrollView这个可以水平横向拖动的控 ...
- Eclipse vim插件安装使用
在eclipse移动关闭位置感觉非常不爽,经常要用到方向键和鼠标,导致经常要移来移去.果断受不了了,去网上搜了下发现eclipse有许多vim插件可以使用.有一个大家都比较推荐的是 vrapper ...
- SNMP配置和常用命令OID(转)
博文转至:http://blog.csdn.net/susu09new/article/details/12835191 OID值表示的意义(中文) .1.3.6.1.2.1.1操作系统相关的信息,其 ...
- java并发编程--Executor框架(一)
摘要: Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程 ...
- POJ 1300 欧拉通路&欧拉回路
系统的学习一遍图论!从这篇博客开始! 先介绍一些概念. 无向图: G为连通的无向图,称经过G的每条边一次并且仅一次的路径为欧拉通路. 如果欧拉通路是回路(起点和终点相同),则称此回路为欧拉回路. 具有 ...
- 单调队列-Hdu-4122-Alice's mooncake shop
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4122 题目意思: 一家月饼店,有n个订单,从2001年1月1日0时开始24小时营业开m个小时,且每个 ...
- oracle函数Lpad与Rpad
函数介绍 lpad函数从左边对字符串使用指定的字符进行填充.从其字面意思也可以理解,l是left的简写,pad是填充的意思,所以lpad就是从左边填充的意思. 语法格式如下: lpad( string ...