2013-04-16 8 views
16

Ich versuche, alle Sitzungsvariablen zu löschen, aber den aktuellen Benutzer nicht abzumelden.So löschen Sie alle Sitzungsvariablen, ohne abgemeldet zu werden

user = request.session.get('member_id', None) 
request.session.flush() 
request.session.modified = True 
request.session['member_id'] = user 
request.session.modified = True 

Wirkt sich dies auch auf andere Benutzer der Website aus?

Antwort

13

In Django 1.8 wird jeder Aufruf von flush() den Benutzer abmelden. Von der docs:

Changed in Django 1.8: Deletion of the session cookie is a behavior new in Django 1.8. Previously, the behavior was to regenerate the session key value that was sent back to the user in the cookie.

Wenn Sie Schlüssel in der Lage sein wollen, zu löschen, aber der Benutzer halten angemeldet, Sie werden es brauchen, um manuell handhaben:

for key in request.session.keys(): 
    del request.session[key] 

Oder nur die spezifischen Schlüssel löschen, sind besorgniserregend:

del request.session['mykey'] 
+5

Ich erhalte eine Störung: für Schlüssel in request.session.keys(): RuntimeError: Wörterbuch änderte Größe während der Iteration. Fix unten. – AdamG

1

request.session intern verwendet Cookies. Und wenn ein Benutzer eine URL der Website anfordert, werden nur auf dem Computer dieses Benutzers vorhandene Cookies an den Server gesendet. So ist request.session immer an den aktuellen Benutzer gebunden.

So wird sich dies in keiner Weise auf andere Benutzer der Website auswirken.

Auch dies wird den aktuellen Benutzer nicht abmelden, da Sie flush() verwenden, die die alte Sitzung löschen und eine neue Sitzung erstellen, und diese neue Sitzung würde dem aktuellen Benutzer zugeordnet werden.

flush() intern verwendet clear(), delete() und create().

In der Antwort würde der Schlüssel dieser neuen Sitzung als Cookie gesendet und in nachfolgenden Anfragen würde diese neue Sitzung normal weiterarbeiten.

+0

Warum abgemeldet bin immer, wenn ich rufe request.session.flush() – Siecje

11

In den Versionen von django < 1.8 löscht session.flush die Sitzungsdaten und regeneriert den Sitzungsschlüssel. Andere Benutzer sind davon nicht betroffen, da die Sitzungsschlüssel eindeutig sind.

+0

es ist nur in django 1.8 +? – aRkadeFR

+3

es ist da seit mindestens 1.3 – Ngenator

+0

nicht bekommen, warum ich die Methoden auf einem Session-Objekt in der Konsole nicht sehen? Ich hole es durch Session.objects.get (Session_key = ...) – aRkadeFR

1
session_keys = list(request.session.keys()) 
    for key in session_keys: 
     del request.session[key] 
3

Als Verbesserung des Shacker 1 in Python 2 .x dict.keys() gibt eine Listenkopie der Schlüssel eines Wörterbuchs zurück, in Python 3.x gibt sie stattdessen einen Iterator zurück. Ändern der Größe eines Iterators ist unklug. Für eine Version sichere Implementierung zur Liste Gießen wird jede Größe verhindern gibt

for key in list(request.session.keys()): 
    del request.session[key] 

meine Antwort die Verwendung von dict.viewkeys() vorgeschlagen, aber es wird auch einen Iterator in Python 3.x zurückkehren

0

Sie können die Tasten löschen, die Sie in der Django-Sitzung festgelegt haben. Um dies zu tun, ohne den Benutzer abzumelden, ist jedoch ein wenig Kniff erforderlich. request.session.flush() meldet den Benutzer an. Und request.session = {} beim Löschen aller Schlüssel im Sitzungswörterbuch wird auch der Benutzer ausloggen.

Um also Schlüssel zu löschen, ohne den Benutzer auszuloggen, müssen Sie Schlüssel vermeiden, die mit einem Unterstrich beginnen. Der folgende Code funktioniert der Trick:

for key in list(request.session.keys()): 
    if not key.startswith("_"): # skip keys set by the django system 
    del request.session[key] 
Verwandte Themen