admin管理员组文章数量:1642330
Flask==1.1.1
Flask-Session==0.3.1
Flask-SQLAlchemy==2.4.1
postgresql==10.5
本文不讨论session为什么使用postgresql而不是redis的问题,讨论SESSION_PERMANENT设置时报错的问题
当SESSION_PERMANENT为False时,当前标签页session有效,开启新标签页session失效(对session理解还不深刻,不知道为什么)。
反之SESSION_PERMANENT为True时,待PERMANENT_SESSION_LIFETIME设置的时间后session才失效。
app.config['SESSION_PERMANENT'] = True # 默认是False
app.config['PERMANENT_SESSION_LIFETIME'] = 600 # 单位秒
问题现象:当SESSION_PERMANENT为False时,登录时报错TypeError: '<=' not supported between instances of 'NoneType' and 'datetime.datetime',定位错误位置是下面这句,
if saved_session and saved_session.expiry <= datetime.utcnow(): # 查询已存的session并校验该session的过期时间是不是小于当前时间
查询数据库发现在id=617的当前session没有expiry值,所以报错。(SESSION_PERMANENT为False,expiry不设置值)
test=> select id,session_id,substring(data,0,10) as data_10,expiry from session;
id | session_id | data_10 | expiry
-----+----------------------------------------------+----------------------+----------------------------
607 | session:73774815-83df-4747-adea-42bf09b0270c | \x80037d710028580a00 | 2020-05-12 01:44:22.61482
608 | session:03636b8f-328b-4915-919c-23641e70b6b9 | \x80037d7100580a0000 | 2020-05-12 01:44:22.704755
616 | session:1547aa8c-e24d-499f-8f2a-c171071e18d4 | \x80037d710028580800 |
617 | session:fa0c6e88-2487-4570-b378-91cf33556229 | \x80037d710028580800 |
(4 行记录)
解决方法:将报错的位置语句修改如下(主要是在saved_session.expiry前先判断是否存在,再与时间比较):
if (not self.permanent and saved_session and saved_session.expiry) or (self.permanent and saved_session and (not saved_session.expiry or saved_session.expiry <= datetime.utcnow())):
# SESSION_PERMANENT为False,有记录的session且有expiry的(以前SESSION_PERMANENT设置过True,遗留的session);
# SESSION_PERMANENT为True,有记录的session,没有expiry(以前SESSION_PERMANENT设置过False,遗留的session)或expiry过期的
以上供大家参考,新的问题:存储的已过期session不能自动删除,会导致表越来越大。。。
欢迎大家留言斧正
本文标签: sessionflaskpostgresqlSQLALCHEMY
版权声明:本文标题:flask session 使用 sqlalchemy postgresql 时的问题 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1729337400a1197159.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论