有没有一种简单的方法可以让烧瓶中的会话超时?

Posted

技术标签:

【中文标题】有没有一种简单的方法可以让烧瓶中的会话超时?【英文标题】:Is there an easy way to make sessions timeout in flask? 【发布时间】:2012-07-31 18:03:55 【问题描述】:

我正在使用烧瓶建立一个网站,用户拥有帐户并能够登录。 我正在使用烧瓶主体进行部分登录和角色管理。 有没有办法让用户的会话在 5 分钟或 10 分钟后过期? 我无法在烧瓶文档或烧瓶主体的文档中找到它。

我想到了一种手动操作的方法,在登录时设置一个带有时间标签的变量服务器端,并且在用户采取的下一个操作时,服务器验证该时间戳上的时间增量并删除会议。

【问题讨论】:

您希望用户会话在 5 或 10 分钟不活动后过期,还是不管活动级别如何都过期? 对于不活动我将不得不实现它。只是在浏览器关闭或 24 小时后过期。它现在根本不会过期。 使会话相对于活动过期:***.com/questions/19760486/… 【参考方案1】:

除非您有永久会话,否则一旦您关闭浏览器,flask 会话就会过期。您可以尝试以下方法:

from datetime import timedelta
from flask import session, app

@app.before_request
def make_session_permanent():
    session.permanent = True
    app.permanent_session_lifetime = timedelta(minutes=5)

在 Flask 中,permanent_session_lifetime 默认设置为 31 天。

【讨论】:

我相信如果您更改app.secret_key并重新启动服务器,您的会话也会被重置。 session.permanent 默认为 False:flask.pocoo.org/docs/api/#flask.session.permanent 你知道permanent_session_lifetime到期时会调用什么吗? 这里使用before_request而不是before_first_request是什么原因? 这是完美的工作!关于会话到期时我们如何闪烁消息的任何建议?【参考方案2】:

是的,我们应该设置

session.permanent = True
app.permanent_session_lifetime = timedelta(minutes=5)

但我认为不应该将其设置为app.before_request,这将导致设置它们的次数过多。

permanent_session_lifetime 是Basics Configuration,所以它应该在你配置应用程序时设置:

 from datetime import timedelta
 app = Flask(__name__)
 app.config['SECRET_KEY'] = 'xxxxxxxxx'
 app.config['PERMANENT_SESSION_LIFETIME'] =  timedelta(minutes=5)

session 将为每个客户端创建,与其他客户端分开。所以,我认为设置session.permanent 的最佳位置是当你login() 时:

@app.route('/login', methods=['GET', 'POST'])
def login():
    #After Verify the validity of username and password
    session.permanent = True

【讨论】:

对于 Apache-Airflow(使用 Flask)在 github.com/apache/incubator-airflow/blob/master/airflow/contrib/… 中设置此设置对我不起作用。 将答案中的链接更新到最新版本:Basics Configuration 我在上面的解决方案中使用带有房间和广播等的烧瓶会话,但对我不起作用。我希望在 5 分钟后用户直接注销并重定向到登录页面....这可能与永久会话有关吗?还是我必须使用 db 并存储登录日期来实现这一点?

以上是关于有没有一种简单的方法可以让烧瓶中的会话超时?的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 3 中设置会话超时

会话超时通知

处理网络应用程序中会话超时的最佳方法?

如何在过期前延长asp.net中的会话超时

如何让 SignalR 连接尊重会话超时

web.xml 中的会话超时