【问题标题】:Websocket (socket.io) proxy with python flask and nodejs带有 python 烧瓶和 nodejs 的 Websocket (socket.io) 代理
【发布时间】:2018-08-01 10:11:30
【问题描述】:

我有 Python Flask 服务器和 NodeJS 服务器,我在 NodeJS 上运行 socket.io 服务器,我的静态应用程序使用 python Flask 服务器提供服务。是否可以通过 Flask 应用程序连接到 socket.io 服务器?我在将 NodeJS 中的 /socket.io 端点代理到 Flask 时遇到困难,有什么提示吗?

我使用 Socket.IO for NodeJS 作为在端口 8888 上运行的服务器, 在 5000 端口运行的 python 烧瓶

【问题讨论】:

    标签: python node.js sockets flask


    【解决方案1】:

    是的,你可以!

    socket.io 服务器上,我有类似的东西:

    io.on('connection', (socket) => {
      socket.emit('init', { id: socket.id, status: 'connected'});
    
      socket.on('user connected', (data) => {
        register_socket_client(redisClient, data);
      });
    
      socket.on('disconnect', () => {
        unregister_socket_client(redisClient, socket.id);
      });
    });
    
    
    server.listen(8080, '0.0.0.0', () => {
      console.log('[*] Server listening on port 8080');
    });
    

    请注意,我将 socket_client 存储在一个 redis 实例中。我让你假设如何实现在 redis 中保存、取消保存某些内容的功能


    所以,在flask渲染的html文件中,我们有:

    // http://localhost:8080 refer to your socket.io server
    var socket = io('http://localhost:8080');
    var user_connected = "{% if current_user.is_anonymous %}false{% else %}true{% endif %}" === 'true';
    
    socket.on('init', function (data) {
      if (user_connected) {
        socket.emit('user connected', { user_id: xxx, socket_id: Nxxx});
    
        socket.on('notify', function (data) {
          // Do something, modify the DOM to add an alert on your app
          console.log(data);
        });
      }
    });
    

    不要关注 user_connected 的事情。只是我只需要为已连接的用户连接socket.io


    现在你的flask渲染的静态应用应该和你的socket.io连接了


    我在 socket.io 服务器 上也有一个私有端点(仅使用 jwt 令牌),如下所示:

    app.post('/notify', passport.authenticate('jwt', { session: false}), (req, res) => {
      const query = req.query;
      const payload = req.body;
    
      if (query.user_id) {
        // here you can retrieve the data from redis based on user_id for example
        // We can assume that we have everything in a `data` variable.
    
        io.to(data.socket_id).emit('notify', payload);
      }
    
      return res.status(200).json({'ping': 'pong'});
    });
    

    Flask 服务器可以发出 request.post('http://localhost:8080/?user_id=USER_ID', data={}) 之类的请求

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      • 2016-10-20
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多