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,它突然起作用.
但我的意思是,我不能将所有内容都放在一个文件中,因为随着应用程序的增长它会变得非常混乱.
您需要做的是将辅助模块导入主模块中,但是您需要在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)
| 归档时间: |
|
| 查看次数: |
984 次 |
| 最近记录: |