烧瓶中的 Socket.io:来自外部源的数据

问题描述 投票:0回答:2

我有一个 Web 应用程序,需要在浏览器上持续显示后端正在进行的操作。我一直在尝试在 Flask 中使用 socket.io。但是我需要从我项目中的其他 Python 模块获取要显示的数据。因此,我尝试在 Flask 和外部模块之间建立套接字连接,我将从中获取数据以显示在浏览器上(没有任何延迟)。

@socketio.on('my event')
def server(message):
    s = socket.socket()       
    print "Socket successfully created"
    port = 12345               
    s.bind(('', port))        
    print "socket binded to %s" %(port)
    s.listen(5)     
    print "socket is listening"           
    while True:
        c, addr = s.accept()     
        print 'Got connection from', addr
        print c.recv(1024)
        emit('my response', {'data': c.recv(1024)})
        c.close()

print c.recv(1024)
正在控制台打印数据。但是相同的数据并没有反映在浏览器上。它抛出这个错误 -

错误:[Errno 98] 地址已被使用

这意味着它在

emit
之后的
print c.recv(1024)
处失败。可能出了什么问题? 我的第一个疑问是是否允许这种连接。我的意思是,我们可以在 Flask 的 socket.io 中创建套接字连接吗? 否则,使用 Flask 在浏览器上连续显示后端操作的最佳解决方案是什么?我也有 Django 的 Web 应用程序。对于我使用 Flask 或 Django 的用例的任何解决方案将不胜感激(最好是 Django)。

python flask flask-socketio
2个回答
3
投票

使用 Miguel 给出的答案,我可以找到合适的解决方案。在外部脚本中,我们需要创建一个

SocketIO
对象如下:

socketio = SocketIO(message_queue='redis://')

然后我就可以用

emit
发送要在前端显示的数据了

def fn():
    socketio.emit('my response', {'data': 'ur data goes here'})

fn()

在前端,

var socket = io.connect('http://' + document.domain + ':' + location.port);
socket.on('connect', function() {
socket.on('my response', function(msg) {
    $('#log').append('<p>Received: ' + msg.data + '</p>');
    document.getElementById('<div_id>').innerHTML += msg.data + "<br>";
    });
});

最后,在Flask服务器端,我们需要创建

SocketIO
对象如下:

socketio = SocketIO(app, message_queue='redis://')

然后运行 Flask

socketio.run(app,host='<ip>',port=<port>)


2
投票

问题是,每次客户端向您的服务器发送名为

my event
的事件时,您将尝试在端口 12345 上启动一个新的套接字服务器。显然这只会在第一次工作。

您看过文档中的从外部进程发出部分吗?

想法是您可以从任何辅助进程向客户端发送事件,这正是您所需要的。该解决方案涉及安装一个消息队列(Redis、RabbitMQ),Flask-SocketIO 服务器和需要发射电源的外部进程连接到该消息队列。

© www.soinside.com 2019 - 2024. All rights reserved.