Flask和插座.io布罗德卡斯

2024-09-28 22:22:07 发布

您现在位置:Python中文网/ 问答频道 /正文

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

http://pastebin.com/i2jNf1w5

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

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

  • 我看到来自broadcastbroadcasting消息
  • 我看到来自broadcast_msg的消息

但是,如果在服务器的另一部分,我导入broadcast函数并从某个端点使用它(例如,在用户发送了一个文件之后),我只看到来自调用broadcast的第一条broadcasting消息,但似乎该消息没有正确地添加到队列中,因为{}从未被调用

有人能告诉我在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到{}使用另一个文件中的broadcast方法,并按如下方式导入:

^{pr2}$

结构为:

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

Tags: 文件代码py服务器消息scriptsmsgsocket
1条回答
网友
1楼 · 发布于 2024-09-28 22:22:07

对于如何导入模块,这可能是一个微妙的问题。一、 你可以用两个不同的模块名加载模块两次,却没有意识到。在

在broadcast()中修改打印,如下所示:

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

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

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

使用Python2.6或更早版本时,我在每个模块的顶部添加from __future__ import absolute_import,以防止此类问题。在

相关问题 更多 >