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

欢迎大家留言斧正

 

你可能感兴趣的:(postgresql,flask,flask,postgresql,经验分享)