2014-04-04 10 views
5

Dies ist eine theoretische Frage, da ich eine Idee über das Konzept habe und noch keinen Code habe.Tornado, Django, Websockets und Session-Synchronisierung

Angenommen, ich verwende Websockets mit Tornado und überbrückt ein Djangoprojekt, das normale Verbindungen verarbeiten würde. Das heißt: Der eigentliche Server ist Tornado, der jede Anfrage erhält und, falls die Anfrage keinen Pfad von/socket hat (etwa), würde der django wsgi-Handler damit umgehen (über einen Fallback-Container). Auf der anderen Seite müssen Anforderungen an/Socket-Pfad ws oder wss-Protokolle haben und von Tornado als Websockets behandelt werden.

Wenn die Verbindung gestartet wird, enthält die erste Anfrage vor dem Upgrade die Cookies, und ich kann die Sitzungs-ID aus den Cookies abrufen und den Session Manager verwenden, um das Sitzungsobjekt nach ID abzurufen. Für den Ablauf dieser Verbindung, die, da es sich um eine Websocket-Verbindung handelt, eine langfristige Verbindung sein wird, werde ich den gleichen Wert für den Sitzungs-ID-Cookie haben (da ich keine Cookie-Header bekomme, weil die Websocket-Verbindung nicht funktioniert) t senden Header nicht mehr - die Idee ist, den Overhead zu reduzieren, und das Übergeben von Cookies mit der Nachricht kann einen enormen Overhead haben).

Es ist bis jetzt ok: Websockets verbinden, senden das Cookie nur einmal, die serverseitige Grenze für diesen Socket kann diesen Cookie-Wert haben (die Session-ID) und damit spielen, bis die Verbindung geschlossen wird.

Meine Frage: Wie kann ich in Echtzeit erkennen, dass eine Sitzung nicht mehr verfügbar ist? (mögliche Gründe: 1. Benutzer hat eine Ressource ausgegeben, die das Schließen der aktuellen Sitzung beinhaltet, obwohl es über AJAX erfolgt und der Websocket nicht geschlossen ist; 2. Sitzung abgelaufen wegen Untätigkeit; 3. irgendwie durch Verwendung von django api ist die Sitzung geschlossen, Obwohl das den aktuellen Ausführungskontext nicht impliziert, wird die Anfrage geschlossen - ich weiß nie, ob ein solches Szenario möglich ist.

Notizen: Wenn eine bestimmte Sitzung geschlossen wurde, konnte ich feststellen, ob die entsprechenden Websockets ebenfalls geschlossen sein müssen.

Antwort

1

Ich nehme an, Sie verwenden das Cookie-System von Django (mit django.contrib.sessions.middleware.SessionMiddleware).

Sie wollen natürlich nicht jede Session-Cookie auf jedem Websocket-Anfrage. Dann ist es Sache des Servers herauszufinden, ob die Sitzung am Leben ist.

Dies erfordert den ständigen Zugriff auf den Sitzungsspeicher. Wenn Sie datenbankgestützte Sitzungen verwenden, führt dies zu erheblichen zusätzlichen Kosten. Wenn Sie cache-backed Sitzungen verwenden, ist es machbar.

Referenz aus der Django-Dokumentation: https://docs.djangoproject.com/en/1.8/topics/http/sessions/