web-dev-qa-db-fra.com

Comment effacer toutes les variables de session sans se déconnecter

J'essaie d'effacer toutes les variables de session mais pas de déconnecter l'utilisateur actuel.

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

Cela affectera-t-il également les autres utilisateurs du site?

17
Siecje

À partir de Django 1.8, tout appel à flush() déconnectera l'utilisateur. De docs :

Modifié dans Django 1.8: La suppression du cookie de session est un comportement nouveau dans Django 1.8. Auparavant, le comportement consistait à régénérer la valeur de la clé de session envoyée) retour à l'utilisateur dans le cookie.

Si vous voulez pouvoir supprimer des clés mais garder l'utilisateur connecté, vous devrez le gérer manuellement:

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

Ou supprimez simplement les clés spécifiques qui vous préoccupent:

del request.session['mykey']
20
shacker

Dans les versions de Django <1.8, session.flush supprime les données de session et régénère la clé de session. Cela n'affectera pas les autres utilisateurs car les clés de session sont uniques.

14
Ngenator

Comme une amélioration de shacker 1 in Python 2.x dict.keys() renvoie une copie de la liste des clés d'un dictionnaire, dans Python 3.x, il renvoie à la place un itérateur. Il n'est pas judicieux de modifier la taille d'un itérateur. Pour une version sûre de la mise en œuvre, le transtypage en liste évitera tout problème de taille

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

Ma réponse précédente suggérait l'utilisation de dict.viewkeys() mais elle retournera également un itérateur dans python 3.x.

5
Robert Wisner

Vous pouvez effacer les clés que vous avez définies dans la session Django, mais le faire sans déconnecter l'utilisateur prend un peu de ruse; request.session.flush() déconnecte l'utilisateur. Et request.session = {} en supprimant toutes les clés du dictionnaire de session déconnectera également l'utilisateur.

Ainsi, pour effacer les clés sans déconnecter l'utilisateur, vous devez éviter les clés qui commencent par un caractère de soulignement. Le code suivant fait l'affaire:

for key in list(request.session.keys()):
  if not key.startswith("_"): # skip keys set by the Django system
    del request.session[key]
3
talkingtoaj
session_keys = list(request.session.keys())
    for key in session_keys:
        del request.session[key]
2
AdamG

request.session Utilise en interne des cookies. Et lorsqu'un utilisateur demande une URL du site, seuls les cookies présents sur la machine de cet utilisateur sont envoyés au serveur. Ainsi, request.session Est toujours lié à l'utilisateur actuel.

Donc, cela n'affectera en rien les autres utilisateurs du site.

De plus, cela ne déconnectera pas l'utilisateur actuel, car vous utilisez flush() qui supprimera l'ancienne session et créera une nouvelle session et cette nouvelle session sera associée à l'utilisateur actuel.

flush() utilise en interne clear(), delete() et create().

Dans la réponse, cette nouvelle clé de session serait envoyée sous forme de cookie et dans les demandes ultérieures, cette nouvelle session continuerait de fonctionner normalement.

1
Akshar Raaj