繁体   English   中英

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

[英]Socket.io in flask: Data from external source

我有一个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]地址已在使用中

这意味着它在print c.recv(1024)之后无法emit 可能出什么问题了? 我的第一个疑问是是否允许这种连接。 我的意思是,我们可以在Flask的socket.io内部创建套接字连接吗? 否则,什么是使用Flask在浏览器上连续显示后端操作的最佳解决方案? 我也有带有Django的Web应用程序。 我的Flask或Django用例的任何解决方案都将受到赞赏(最好是Django)。

问题在于,每次客户端将名为my event的事件发送到您的服务器时,您都将尝试在端口12345上启动新的套接字服务器。显然,这仅在第一次使用时有效。

您是否在文档中看到了“ 来自外部流程排放”部分?

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

使用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://')

然后使用socketio.run(app,host='<ip>',port=<port>)运行Flask

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM