【问题标题】:Flask socket.io message events in different files不同文件中的 Flask socket.io 消息事件
【发布时间】:2017-10-09 23:51:31
【问题描述】:

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)

选举管理.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 时,它突然起作用了。

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

【问题讨论】:

    标签: python flask-socketio


    【解决方案1】:

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

    【讨论】:

    • 我可以发誓它工作了一段时间,但我可能已经在两个文件中都得到了这个事件。无论如何,即使使用您提到的导入语句,当事件仅在导入的文件中时仍然不会被调用:(
    • __main__ 的信息更新了我的答案。
    • 您好 netik,您找到解决此问题的方法了吗?
    猜你喜欢
    • 2020-01-24
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 2020-11-23
    相关资源
    最近更新 更多