flask的session源码流程和第三方组件 flask的session源码 使用第三方插件 总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

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

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

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

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

使用第三方插件

通过上面的源码就可以看出,使用第三方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)

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

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

flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结
其中的signer = self._get_signer(app)有别于内部使用的hashlib.sha1,这里使用的hmac
flask的session源码流程和第三方组件
flask的session源码
使用第三方插件
总结

总结

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