2017-02-22 69 views
1

我正在创建一个应用程序,用于可视化来自网页中远程科学仪器的一些数据。我正在使用Flask来开发它。此外,我使用Flask-Login让陌生人远离,并使用Socket.io在(客户端)浏览器和服务器之间进行交互,即将数据和状态从仪器(使用Python)发送给用户(浏览器使用Javascript) 。Flask,Flask-Login和Socket.io:即使未发送请求时也保持会话活动

使用Flask-Login我想让会话保持活动状态,比方说,10分钟。我发现在博客中这小小的一段代码(这我也用我的应用程序),其中每个用户发送一个请求(酷使用瓶的装饰before_request的)时间刷新了本届会议:

@app.before_request # Jordan Bonser snippet 
def before_request(): 
    session.permanent = True 
    app.permanent_session_lifetime = datetime.timedelta(minutes=10) 
    session.modified = True 
    g.user = current_user 

当有人通过发送请求来使用应用程序时,这很好。我明白,这意味着从字面上浏览页面(粗略地讲,在使用应用程序时执行app.route)。

问题是,在我的应用程序中,用户实际上只会使用一个页面,同时观察数据是如何进入的,以及如何使用SocketIO实现一些坐标和图形实时更改。这意味着如果我在10多分钟内主动使用应用程序 - 尽管不通过网页浏览 - 我的会话无论如何都会失效。

有什么办法可以在这些条件下保持会话活动?我在想,也许SocketIO可以通过在服务器上执行一些Flask命令来帮助解决这个问题,每当用户在浏览器中有效地接收到一些数据时,我真的不知道如何实现这一点。提前致谢。

回答

0

有趣的问题。

不幸的是,Socket.IO事件中的会话访问不是双向的。您可以获取会话的内容,但无法进行修改,因为整个Socket.IO会话发生在单个WebSocket请求中,因此无法使用会话更新发送HTTP响应。

如果您打算使用服务器端会话(您可以使用Flask-Session或Flask-KVSession扩展实现),则规则会更改。如果会话存储在服务器控制的数据库中,则可以从Socket.IO进行更改,例如更新生存期。

如果您决定使用来自Flask的基于Cookie的默认会话,则会变得复杂。我认为你需要停止使用会话永久生命周期设置,而是写一个last_access时间到你的用户数据库(我假设你有一个用户数据库?)。您可以在Socket.IO事件中更新此时间戳记,也可以在before_request处理程序中更新此时间戳记。在before_request中,您将检查上次访问时间戳,如果发现该时间戳比10分钟早,则可以使会话失效。

+0

感谢@Miguel的回答。其实我只有一个用户(这是一个非常简单的登录),我将它的信息存储在还存储应用程序的机器的环境变量中。也许我使用我发布的代码片段的方法是不正确的。你是否认为每次有新来的事件刷新会话都是一个好主意,与'before_request'一样? PS:感谢您的优秀教程,我学到了很多! –

+0

@SebasthianOgalde你正在做的事情很好,但它不是一个适用于Socket.IO事件的解决方案,因为在那些会话中不可写。如果你只有一个用户,你可以在Python进程中使用一个全局变量来存储上次用户发送请求或Socket.IO事件的时间。然后,在您的请求处理程序之前,您可以检查该请求,如果最后一个请求/事件是在X分钟之前发送的,那么您认为会话过时并使其无效。 – Miguel

+0

所以这个问题被简化为一种'before_event'装饰器。 Flask-SocketIO中有这样的东西吗?或者至少有一种方法可以在浏览器中轻松更新来自客户端的任何接收到的事件的全局变量?如果不是,我认为最后的解决方案是修饰或覆盖socketio.on函数。 –

相关问题