Python Flask, wie erkennt man einen SSE-Client vom Front-End trennen Javascript

9

Vielleicht ist das ein Problem in Flask, es gibt keine Möglichkeit, Trennereignis auf der Serverseite zu behandeln.

In der Antwortklasse gibt es eine Methode namens "call_on_close", in der wir eine Funktion ohne Argument hinzufügen können, z. on_close (), wird ausgelöst, wenn die close-Methode des Antwortobjekts aufgerufen wird. Dies geschieht jedoch nicht, wenn ich EventSource.close () auf der Clientseite in JavaScript aufruft.

Code auf der Serverseite:

%Vor%

auf der Client-Seite: Entlade-Handler zur Seite mit SSE hinzufügen

%Vor%

Irgendwas stimmt nicht?

Alle Vorschläge oder Lösungen mit Code sind willkommen!

Vielen Dank im Voraus!

    
bwlee 22.08.2013, 14:15
quelle

1 Antwort

2

Ich hatte ein ähnliches Problem mit Rails Live Controllern. Das Problem besteht darin, dass das Framework anscheinend nicht erkennt, dass die Verbindung geschlossen wurde, bis es versucht, ein Ereignis an den Client zu senden.

Ein Ansatz besteht darin, periodische "Heartbeat" -Ereignisse an den Client zu senden. Ich verwende dies derzeit erfolgreich in meinem Rails-Projekt mit einem Intervall von 60 Sekunden. Ich habe einen separaten Thread, der diese Heartbeats in Redis "sendet", die mein Controller abonniert hat.

Eine Alternative zum Threaded-Ansatz ist das Umbrechen des Redis-Pubsub-Blocks mit einem Timeout (wiederum sagen wir 60 Sekunden). Und dann senden Sie das Heartbeat-Ereignis an den Client - gefolgt von einem weiteren Pubsub-Aufruf. Der Nachteil dieses Ansatzes besteht darin, dass Sie möglicherweise ein Ereignis verpassen, während Sie nicht abonniert sind.

Hier gibt es mehr zum Threading-Ansatz: Redis + ActionController :: Live-Threads nicht aussterben

    
Nigel Ramsay 01.11.2013 20:48
quelle