flask的session源码流程和第三方组件

flask的session源码

1112571-20180813101833038-661587599.png

1112571-20180813102122368-610740833.png

1112571-20180813101922973-1138390031.png

1112571-20180813102338262-1370061575.png

1112571-20180813102356504-1832098742.png

1112571-20180813102633951-1044337770.png

1112571-20180813102756496-343384547.png

1112571-20180813103718368-705688189.png

1112571-20180813103800754-831042048.png

1112571-20180813103821534-459014078.png

1112571-20180813103856499-1259244646.png

1112571-20180813103918580-1535468788.png

1112571-20180813104011612-575824094.png

1112571-20180813104158755-1172129506.png

至于为什么使用session一定需要加上 app.secret_key?看源码

1112571-20180813104430149-685459788.png

1112571-20180813104448271-1652882108.png

1112571-20180813104554419-551334177.png

1112571-20180813104718703-383760281.png

1112571-20180813104743510-1447461908.png

session在没值的情况下使用会报错

1112571-20180813104917205-265984190.png

1112571-20180813104925208-1769196362.png

1112571-20180813104944374-763936149.png

使用第三方插件

通过上面的源码就可以看出,使用第三方flask-session插件,本质上就是替换app的session_interface接口对象,而这个接口对象必须实现两个最基本的方法:open_session和save_session方法
安装: pip3 install flask_session

两种使用方式:

from redis import Redis
from flask_session import RedisSessionInterface
r_conn = Redis(host='localhost', port=6379, password='123456')
app.session_interface = RedisSessionInterface(redis=r_conn, key_prefix='xxx')
from flask_session import Session
from redis import Redis
r_conn = Redis(host='localhost', port=6379, password='123456')
app.config['SESSION_TYPE'] = 'redis'  # session类型为redis
app.config['SESSION_PERMANENT'] = False  # 如果设置为True,则关闭浏览器session就失效。
app.config['SESSION_USE_SIGNER'] = False  # 是否对发送到浏览器上session的cookie值进行加密
app.config['SESSION_KEY_PREFIX'] = 'session:'  # 保存到session中的值的前缀
app.config['SESSION_REDIS'] = r_conn
Session(app)

1112571-20180813110137517-870971282.png

1112571-20180813110200451-1665381001.png

1112571-20180813110234066-1743923612.png

第二种方式是经常使用的,而且Session(app)这种格式的形式使用第三方插件的形式和常用,本质上大多数就是对app进行处理。
简单看一下RedisSession的源码流程

1112571-20180813111234521-1916335481.png
其中的signer = self._get_signer(app)有别于内部使用的hashlib.sha1,这里使用的hmac
1112571-20180813111523194-679431114.png

总结

flask的session说白了,其实请求到来然后在视图函数去使用的时候,把一个经过加密等出处理的字符串还原成字典,然后在视图中对这个字典进行操作,请求结束的时候,在把这个字典经过加密等处理弄成一个看不懂的字符串,然后循环上述过程。这里还有一个问题没有提到,那就算我们在视图函数里使用的session变量,是怎么对应到app.open_session拿到的结果的,其实app.open_session是作为ctx的session属性存放着的,至于这里的ctx是什么对象,就需要说到Flask的上下文管理

转载于:https://www.cnblogs.com/longyunfeigu/p/9466591.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值