在两个烧瓶服务器之间共享会话

时间:2017-03-18 21:14:34

标签: python session flask socket.io flask-socketio

我有一个带有两个烧瓶服务器的后端。一个处理所有RESTfull请求,另一个是flask-socketio服务器。有没有办法在这两个应用程序之间共享会话变量(登录用户等)?如果这很重要,它们会在不同的端口上运行。

我如何理解他们在客户会话cookie上工作的会话,所以这些服务器是否都不能访问这些信息?如果有,怎么样?如果没有,是否有办法达到同样的效果?

2 个答案:

答案 0 :(得分:4)

有两种方法可以解决这个问题,具体取决于您如何设置两台服务器。

最简单的解决方案是让两台服务器在同一域和端口上显示给客户端。例如,您可以将www.example.com/socket.io作为Socket.IO服务器的根目录,并将www.example.com上的任何其他URL发送到您的HTTP服务器。要实现此目的,您需要使用反向代理服务器,例如nginx。客户端不直接连接到您的服务器,而是在单个端口上连接到nginx,并且nginx配置为根据URL转发相应服务器的请求。

通过上述设置,两台服务器都会暴露给同一域上的客户端,因此会话cookie将被发送给两者。

如果您希望服务器看起来与客户端分开,那么共享会话数据的一个好选择是切换到服务器端会话,存储在Redis,memcache等中。您可以使用Flask-Session来设置那个。

希望这有帮助!

答案 1 :(得分:0)

我发现flask.session.sid = sid_from_another_domain在具有单个子域的情况下效果很好。

我有几个烧瓶应用程序都有各自的域名,例如A.domain.com,B.domain.com和C.domain.com。 它们全部基于flask,并且redis会话管理器已连接到同一redis服务器。

我想联合他们一次登录并注销。

当我登录A并将其传递给域B时,我必须将会话ID与用户信息一起保存在db上。 这些域使用oauth2协议进行通信,在这种情况下,我使用flask_dance。 并将其设置为B域上的flask.session.sid。 然后我可以确认该实现效果很好。