为什么flask-session存储文件为明文且执行session.pop后不删除对应文件?
问题1解答:session内容未加密的原因
你配置的SESSION_USE_SIGNER = True只负责给会话ID做签名防伪造,不会对服务端存储的session内容做加密。Flask-Session默认只会把session数据做pickle序列化后直接存储,序列化只是把Python对象转成可写入文件的二进制格式,没有加密能力,所以你能在文件里看到email这类明文字符串,其余乱码是pickle的结构标识,属于正常现象。
官方设计默认假设服务端存储是可信环境,没有内置服务端session加密能力,如果你需要加密敏感内容,可以自行在写入session前对敏感字段做对称加密,读取时再解密。
你用cachelib.FileSystemCache是完全正确的,旧版werkzeug.contrib.cache早已弃用,相关功能已经迁移到cachelib库,这个不是导致你问题的原因。
问题2解答:session.pop后文件未删除的原因
session.pop('email', None)只是删除session里的单个字段,整个会话本身还保留了csrf_token、_permanent等其他字段,所以对应的存储文件不会被删除。
如果要在登出时彻底销毁会话、删除对应存储文件,需要调用session.clear()清空所有session内容。另外Flask-Session的文件存储默认不会主动清理过期的会话文件,你可以添加两个配置实现自动清理冗余文件:
# 配置会话有效期为1天,单位秒 app.config['PERMANENT_SESSION_LIFETIME'] = 86400 # 配置最多存储500个会话文件,超过阈值时自动清理最早过期的文件 app.config['SESSION_FILE_THRESHOLD'] = 500
你遇到的每次访问生成2个文件的问题,是首次请求会话初始化时重复生成会话ID导致的,配置上述参数清理冗余文件后即可恢复正常。
内容的提问来源于stack exchange,提问作者Derik002
相关产品推荐
相关产品推荐

