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
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