我有一个带有两个烧瓶服务器的后端。一个处理所有RESTfull请求,另一个是flask-socketio服务器。有没有办法在这两个应用程序之间共享会话变量(登录用户等)?如果这很重要,它们会在不同的端口上运行。
我如何理解他们在客户会话cookie上工作的会话,所以这些服务器是否都不能访问这些信息?如果有,怎么样?如果没有,是否有办法达到同样的效果?
答案 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
。
然后我可以确认该实现效果很好。