2017-10-07 2 views
5

socketservice.py:Flask socket.io Nachrichtenereignisse in verschiedenen Dateien

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

Das Problem ist, dass das createElection Ereignis wird nie genannt wird, wenn es innerhalb der Datei electionAdministration.py. Wenn ich es in socketservice.py verschiebe, funktioniert es plötzlich.

Aber ich meine, ich kann nicht alles in eine Datei schreiben, da es sehr chaotisch wird, wenn die Anwendung wächst.

Antwort

2

Was Sie tun müssen, ist Ihr Sekundärmodul in das Hauptmodul zu importieren, aber Sie müssen es tun, nachdem die socketio Variable erstellt wird, denn wenn nicht, werden Sie in kreisförmige Abhängigkeitsfehler laufen.

Beispiel:

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) 

Darüber hinaus müssen Sie berücksichtigen, dass Ihr Haupt-Python-Skript wird nicht socketservice genannt werden, weil Python immer Namen der Top-Level-Skript __main__. Also, wenn Sie das Skript als Haupt-Skript starten, sollte die zweite Datei socketio importieren wie folgt:

from __main__ import socketio 

Dies ist ein kleines Ärgernis mit Python, die schlechter gemacht wird, wenn Sie ein Skript haben wollen, dass Sie manchmal als Hauptskript ausgeführt, aber manchmal möchten Sie auch, dass es von einem anderen Skript importiert wird. Um den Import in einem solchen Fall zu machen, verwende ich den folgenden Trick:

try: 
    from __main__ import socketio 
except ImportError: 
    from socketservice import socketio 
+0

Ich könnte schwören, dass es für eine Weile funktioniert hat, aber ich könnte mit dem Ereignis in beiden Dateien gelandet sein. Wie auch immer, selbst mit der Import-Anweisung, die Sie erwähnt haben, wird das Ereignis immer noch nicht aufgerufen, wenn es nur in der importierten Datei ist :( – netik

+0

Meine Antwort wurde mit Informationen über '__main__' aktualisiert. – Miguel

Verwandte Themen