flask的session源码
至于为什么使用session一定需要加上 app.secret_key?看源码
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)
第二种方式是经常使用的,而且Session(app)这种格式的形式使用第三方插件的形式和常用,本质上大多数就是对app进行处理。
简单看一下RedisSession的源码流程
其中的signer = self._get_signer(app)有别于内部使用的hashlib.sha1,这里使用的hmac
总结
flask的session说白了,其实请求到来然后在视图函数去使用的时候,把一个经过加密等出处理的字符串还原成字典,然后在视图中对这个字典进行操作,请求结束的时候,在把这个字典经过加密等处理弄成一个看不懂的字符串,然后循环上述过程。这里还有一个问题没有提到,那就算我们在视图函数里使用的session变量,是怎么对应到app.open_session拿到的结果的,其实app.open_session是作为ctx的session属性存放着的,至于这里的ctx是什么对象,就需要说到Flask的上下文管理