代码之家  ›  专栏  ›  技术社区  ›  netik

烧瓶插座。不同文件中的io消息事件

  •  9
  • netik  · 技术社区  · 7 年前

    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 ,它突然起作用了。

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

    1 回复  |  直到 7 年前
        1
  •  4
  •   Miguel Grinberg    7 年前

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