Flask和socket.io广播

时间:2013-12-11 12:46:38

标签: python websocket socket.io flask

我想在服务器上的某个事件发生时使用SocketIO来广播消息,现在我使用这个代码

http://pastebin.com/i2jNf1w5

我在启动服务器时调用gevent.spawn(loop_send_queued_messages, server)

当客户端向'/ emit'发送数据时,一切正常:

  • 我看到来自broadcasting
  • broadcast消息
  • 我看到来自broadcast_msg
  • broadcast_msg消息

但是,如果在服务器的另一部分我导入broadcast函数并且我从某个端点使用它(例如在用户发送文件之后),我只看到第一个broadcasting消息从调用到broadcast,但似乎消息未正确添加到队列中,因为永远不会调用broadcast_msg

有人能告诉我在Flask中使用SocketIO从我的服务器代码中的任何位置进行广播的最佳方法吗?

[编辑]考虑到下面的评论,我有这个

broadcasting newDatasetAvailable features 4363892432 scripts.socket_routes
127.0.0.1 - - [2013-12-11 15:56:07] "POST /datastore/features HTTP/1.1" 200 115 0.003130
broadcasting msg refreshData 4363648208 socket_routes
127.0.0.1 - - [2013-12-11 15:56:07] "POST /emit HTTP/1.1" 200 115 0.000540
broadcast_msg msg (u'refreshData',)

所以一个是scripts.socket_routes,另一个是socket_routes

/emit端点与websocket_queue在同一文件中定义,POST/datastore使用其他文件中的broadcast方法,像这样导入它:

from scripts.socket_routes import broadcast

结构是:

scripts/
    __init__.py
    socket_routes.py # where websocket_queue and broadcast are defined
    dataset_routes.py # where broadcast is imported

1 个答案:

答案 0 :(得分:0)

这可能是您导入模块的一个微妙问题。即您可能在两个不同的模块名称下加载了两次模块而没有实现它。

修改broadcast()中的print,如下所示:

print "broadcasting", name, data, id(websocket_queue), __name__

确保从服务器代码调用时显示相同的id和模块名称,就像客户端发送数据时调用的那样。

如果信息不匹配,那么这可能就是问题所在。它通常是由相对进口(这是邪恶的)引起的。在任何地方切换到absolute imports,这可能会解决问题。

使用Python 2.6或更早版本时,我将from __future__ import absolute_import添加到每个模块的顶部以防止出现这些问题。