Warum verschwinden einige Flask-Sitzungswerte nach dem Schließen des Browserfensters aus der Sitzung, erscheinen aber später wieder, ohne dass ich sie hinzufüge?

8

Also mein Verständnis von Flask-Sitzungen ist, dass ich es wie ein Wörterbuch verwenden kann und Werte hinzufügen kann, indem ich Folgendes tue:

session ['Schlüsselname'] = 'ein Wert hier'

Und das funktioniert gut.

Auf einer Route habe ich den Client-Anruf mit AJAX-Post, ich weise der Sitzung einen Wert zu. Und es funktioniert gut. Ich kann auf verschiedene Seiten meiner Website klicken und der Wert bleibt in der Sitzung. Wenn ich jedoch das Browserfenster schließe und dann zu meiner Site zurückkehre, ist der Sitzungswert, den ich dort hatte, verschwunden.

Also das ist seltsam und du denkst, das Problem ist, dass die Sitzung nicht permanent ist. Ich habe auch Flask-Openid implementiert und die Sitzung verwendet, um Informationen zu speichern, und das funktioniert nicht , wenn ich das Browserfenster schließe und es wieder öffne. Ich habe auch den Cookie nach dem Schließen des Browserfensters überprüft, aber bevor ich auf meine Seite zurück gehe, und der Cookie ist tatsächlich noch da.

Ein weiteres merkwürdiges Verhalten (das verwandt sein kann) ist, dass einige Werte, die ich zu Testzwecken in die Sitzung geschrieben habe, verschwinden, wenn ich auf die AJAX-Postroute zugreife und den richtigen Wert zuweise. Das ist seltsam, aber was wirklich seltsam ist, ist, dass, wenn ich dann das Browserfenster schließe und es wieder öffne, und so den Wert verloren habe, den ich zu behalten versuchte, tatsächlich diejenigen, die ich zuvor verloren habe! Sie werden nicht neu zugewiesen, da in meinen Python-Dateien kein Code vorhanden ist, um diese Werte neu zuzuweisen.

Hier sind einige Ausgaben für Helfer um es klarer zu machen. Sie werden alle von einer Route für eine echte Seite ausgegeben, und nicht die oben erwähnte AJAX-Postroute.

Dies ist die Ausgabe, nachdem ich den Wert zugewiesen habe, den ich in der Sitzung speichern möchte. Der Wertschlüssel ist 'Benutzer-ID' - alle anderen Werte sind Dummy-Werte, die ich hinzugefügt habe, um dieses Problem zu lösen. 'userid': 8 bleibt in der Sitzung, solange ich das Browserfenster nicht schließe. Ich kann auf andere Routen zugreifen und der Wert wird dort bleiben, wie es sollte.

%Vor%

Wenn ich das Browserfenster schließe und zurück in die Site gehe, aber ohne die AJAX-Post-Anfrage zu wiederholen, bekomme ich diese Ausgabe:

%Vor%

Der 'yo' Wert war nicht in der ersten Ausgabe. Ich weiß nicht, woher es kam. Ich habe meinen Code für "yo" durchsucht und es gibt keine Fälle, in denen ich diesen Wert irgendwo zugewiesen habe. Ich denke, ich habe es vor einigen Tagen der Sitzung hinzugefügt. Es scheint also, als ob es persistiert, aber versteckt wird, wenn die anderen Werte geschrieben werden.

Und das letzte ist, dass ich wieder auf die AJAX Post-Route zugreife und dann zu der Seite gehe, auf der die Schlüssel mit Hilfe von Debug ausgegeben werden. Die gleiche Ausgabe wie die erste Ausgabe, die ich oben eingefügt habe, was Sie erwarten würden, und der Wert 'yo' ist wieder weg (aber es wird zurückkommen, wenn ich das Browserfenster schließe)

%Vor%

Ich habe das sowohl in Chrome als auch in Firefox getestet.

Ich finde das alles merkwürdig, und ich vermute, dass es auf ein Missverständnis der Funktionsweise der Sitzungen zurückzuführen ist. Ich denke, dass sie Wörterbücher sind, und ich kann Wörterbuchwerte in sie schreiben und sie Tage später abrufen, solange ich die Sitzung als dauerhaft festlege und der Cookie nicht gelöscht wird.

Irgendwelche Ideen, warum dieses seltsame Verhalten passiert?

    
Ben 07.12.2012, 09:11
quelle

2 Antworten

12

Es stellte sich heraus, dass das Problem eine Mehrfachdomain-Cookie-Sache war. Ich betreibe die Site lokal bei 127.0.0.1:5000, aber manchmal wurde auf die Site unter localhost: 5000 zugegriffen - also hatte jede dieser Domains einen separaten Cookie. Das erklärt, warum die Daten verschwanden und dann wieder auftauchten. Es war nur mit verschiedenen Domänen verbunden.

Im Folgenden finden Sie nur zusätzliche Details

Dies kam zustande, weil Facebook keine IP-Adressen für Domainnamen mag. Bei der lokalen Entwicklung habe ich 127.0.0.1:5000 verwendet, aber die Facebook-Rückruf-URL war localhost: 5000. Das funktioniert gut, weil Flask Anfragen an beiden URLs entgegennimmt und sie gleich behandelt - alle Routen funktionieren wie erwartet. Außer den Sitzungscookies, die mit den verschiedenen URLs verknüpft werden.

    
Ben 07.12.2012, 22:12
quelle
5

Flask-Sitzungen werden gelöscht, sobald Sie den Browser schließen, wenn Sie session.permanent = True nicht eingestellt haben. So werden Flask-Sitzungen definiert und in den Dokumenten erwähnt.

Wenn Sie die Sitzung jedoch als permanent festlegen, beträgt der Standardwert 31 Tage, wenn die Sitzung bestehen bleibt. Sie können diesen Standard auch um session.permanent_session_lifetime ändern. Dies bedeutet, dass die Sitzung auch dann fortbesteht, wenn Sie den Browser schließen, es sei denn, Sie löschen den Cookie selbst manuell.

In Ihrem Fall bin ich mir nicht sicher, wie Sie AJAX-Aufrufe verwenden, aber im Allgemeinen sollte das oben Genannte für Standard-Flask-Sitzungen gelten.

    
codegeek 07.12.2012 16:03
quelle