Seite 1 von 1

SocketIO in verschiedenen Klassen (mit Flask)

Verfasst: Mittwoch 1. September 2021, 11:58
von tschaka81
Hallo,

ich habe mich heute ein wenig mit SocketIO auseinandergesetzt. Dabei haben einfach Beispiele funktioniert. Ich bin dann zu etwas komplizierterem übergegangen.

Folgendes Szenario:

Code: Alles auswählen

app = Flask(__name__)
socketio = SocketIO(app)
socketslinks(socketio)  # Importiere Socket Links
eventlet.wsgi.server(eventlet.listen(('', 5000)), app)
socketlinks importiert aus einer zweiten Datei folgendes:

Code: Alles auswählen

[b]detectorliste = list_of_devices()[/b]
def socketslinks(socketio):
    detectorliste.socketio = socketio
   
    @socketio.on('my event')
    def handle_message(data):
        print('received message: ' + str(data))

    @socketio.on('test')
    def handle_message(data):
        socketio.emit('my response', data, broadcast=True)
Das klappt schon einmal mit einem einfachen hin und her senden der Daten.

Dann habe ich folgendes gemacht:
detectorliste ist eine weitere Klasse welche ich geschrieben habe. Dort habe ich wie oben gezeigt socketio hinzugefügt

Code: Alles auswählen

class list_of_devices:
    def __init__(self):
        self.detectors = {}
        self.create_detectorlist()
        self.open_all_detectors()
        self.socketio = None

    def test(self):
        self.socketio.emit('my response', "Hallo Welt", broadcast=True)

 
danach führe ich die Methode test aus

Code: Alles auswählen

self.socketio.emit('my response', "Hallo Welt", broadcast=True)
Alles läuft auch ohne Fehler durch. Allerdings schickt socket.io keine Nachrichten an meine Webseite, so wie es die Funktion oben (socketslinks) noch korrekt tat und auch parallel tut.

Habt ihr Ratschläge?

Re: SocketIO in verschiedenen Klassen (mit Flask)

Verfasst: Mittwoch 1. September 2021, 12:55
von tschaka81
Hallo,

ich habe die Ursache gefunden:

Das Problem scheint bei eventlet zu liegen. Ändere ich auf die nicht Produktionsumgebung, dann klappt alles. Weiß jemand warum das so ist?

Code: Alles auswählen

socketio.run(app, host='0.0.0.0', port=5000)
#eventlet.wsgi.server(eventlet.listen(('', 5000)), app)