我有一个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)。
答案 0 :(得分:2)
问题是每次客户端将名为my event
的事件发送到您的服务器时,您将尝试在端口12345上启动一个新的套接字服务器。显然这只是第一次工作。
您是否在文档中看到了Emitting from an External Process部分?
我们的想法是,您可以从任何辅助流程向客户端发出事件,这正是您所需要的。解决方案涉及安装消息队列(Redis,RabbitMQ),Flask-SocketIO服务器和需要具有发射功率的外部进程连接到该消息队列。