2017-10-07 59 views
5

socketservice.py消息事件瓶socket.io在不同的文件

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时,它突然生效。

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

回答

2

你需要做的是在主模块中导入你的辅助模块,但是你需要在创建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 
+0

我可以发誓它工作了一段时间,但我可能已经结束了在这两个文件中的事件。无论如何,即使您提到的导入声明,只有在导入的文件中才会调用该事件:( – netik

+0

已更新我的答案,其中包含有关__main__'的信息。 – Miguel