flask session 使用 sqlalchemy postgresql 时的问题

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不能自动删除,会导致表越来越大。。。

欢迎大家留言斧正

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值