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

net*_*tik 5 python flask-socketio

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)
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

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

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

Mig*_*uel 5

您需要做的是将辅助模块导入主模块中,但是您需要在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)
Run Code Online (Sandbox Code Playgroud)

另外,您需要考虑您的主Python脚本不会被调用socketservice,因为Python总是命名顶级脚本__main__。因此,如果您将上述脚本作为主脚本启动,则第二个文件应按socketio如下方式导入:

from __main__ import socketio
Run Code Online (Sandbox Code Playgroud)

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

try:
    from __main__ import socketio
except ImportError:
    from socketservice import socketio
Run Code Online (Sandbox Code Playgroud)