Flask socket.io 不同文件中的消息事件

Flask socket.io message events in different files

socketservice.py:

from flask import Flask, render_template
from flask_socketio import SocketIO, emit
from backend.database import db

app = Flask(__name__)
socketio = SocketIO(app, engineio_logger=True)

@socketio.on('connect')
def handle_connection():
    from backend.electionAdministration import syncElections
    syncElections()

if __name__ == '__main__':
    socketio.run(app)

electionAdministration.py:

from flask_socketio import SocketIO, emit
from bson.json_util import dumps
from backend.socketservice import socketio
from backend.database import db

def syncElections():
    elections = db.elections.find()
    emit('syncElections',dumps(res) , broadcast=True)

@socketio.on('createElection')
def createElection(data):
    db.elections.insert({'title': data["title"]})
    syncElections()

问题是,当 createElection 事件在文件 electionAdministration.py 中时,它永远不会被调用。当我把它移到 socketservice.py 时,它突然起作用了。

但我的意思是,我不能将所有内容都放在一个文件中,因为随着应用程序的增长,它会变得非常混乱。

你需要做的是在主模块中导入你的辅助模块,但是你需要在创建 socketio 变量之后进行,因为否则你会 运行 进入循环依赖错误。

示例:

from flask import Flask, render_template
from flask_socketio import SocketIO, emit
from backend.database import db

app = Flask(__name__)
socketio = SocketIO(app, engineio_logger=True)

@socketio.on('connect')
def handle_connection():
    from backend.electionAdministration import syncElections
    syncElections()

import electionAdministration  # <--- import your events here!

if __name__ == '__main__':
    socketio.run(app)

此外,您需要考虑您的主要 Python 脚本不会被调用 socketservice,因为 Python 总是命名顶级脚本 __main__.所以,如果你启动上面的脚本作为你的主脚本,第二个文件应该导入 socketio 如下:

from __main__ import socketio

这是 Python 的一个小烦恼,当您想要一个有时 运行 作为主脚本但有时又希望它是的脚本时,情况会变得更糟由另一个脚本导入。为了在这种情况下导入工作,我使用了以下技巧:

try:
    from __main__ import socketio
except ImportError:
    from socketservice import socketio