簡體   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