首页 > 解决方案 > Socketio 事件不会从其他 python 文件发出

问题描述

我正在python中使用socketio和flask构建一个应用程序。

为了维护套接字和房间,我创建了以下类来保存每个连接的用户:

class Socket:
  def __init__(self, sid):
    self.sid = sid
    self.connected = True
    self.character = None

  def emit(self, event, data):
    socketio.emit(event, data, room=self.sid)

这使我可以专门向该用户发出事件。这个类暂时在我的server.py中声明(我的主脚本)

在一个单独的文件中,我有以下类:

from __main__ import socketio
from __main__ import Socket

class Battle():
    def __init__(self, contestant_one=None, contestant_two=None, room_name=""):
        self.contestant_one = contestant_one
        self.contestant_two = contestant_two
        self.room_name = room_name

    def start_battle(self):
        if self.contestant_one and self.contestant_two is not None:
            self.contestant_one.emit('start battle', JSONEncoder().encode(self.contestant_one.character.__dict__))  

上面的类被导入到 server.py (我的主脚本)中,如下所示:

app = Flask(__name__, static_folder="static")
app.config['SECRET_KEY'] = 'vnkdjnfjknfl1232#'
socketio = SocketIO(app)

class Socket:
def __init__(self, sid):
    self.sid = sid
    self.connected = True
    self.character = None

def emit(self, event, data):
    socketio.emit(event, data, room=self.sid)

from battle import Battle

注意我是如何在 socketio 和 socket 定义之后导入的?这是根据: Flask socket.io message events in different files

参赛者一和参赛者二都是在 server.py 中定义的套接字对象,并且能够向特定用户发出消息,但在战斗中不会发出事件。我已经在两个客户端浏览器中检查了我设置为侦听该消息的简单日志,但没有任何消息。也没有发生错误。

客户端JS代码:

    socket.on('start fight', function(characters){
        console.log(characters)
    })

我还尝试使用 start_battle 方法中的打印语句对此进行测试,因此我知道代码正在执行,因为打印发生了。

我会提到我是 python 新手,并且在涉及 socketio 时主要使用 node。任何建议表示赞赏。

标签: pythonwebsocketimportsocket.io

解决方案


 socket.on('start fight', function(characters){
    console.log(characters)
})

正在侦听,'start fight'但正在发出战斗事件'start battle'

这在更正后起作用了。


推荐阅读