web-dev-qa-db-ja.com

ログアウトせずにすべてのセッション変数をクリアする方法

すべてのセッション変数をクリアしようとしていますが、現在のユーザーをログアウトしていません。

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

これはサイトの他のユーザーにも影響しますか?

17
Siecje

Django 1.8以降、flush()を呼び出すとユーザーがログアウトされます。 docs から:

Django 1.8での変更:セッションCookieの削除は、Django 1.8での新しい動作です。以前は、送信されたセッションキー値を再生成するという動作でした。 Cookieでユーザーに戻します。

キーを削除できるようにしたいが、ユーザーはログインしたままにする場合は、手動で処理する必要があります。

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

または、懸念のある特定のキーを削除します。

del request.session['mykey']
20
shacker

Django <1.8のバージョンでは、 session.flush セッションデータを削除し、セッションキーを再生成します。セッションキーは一意であるため、他のユーザーには影響しません。

14
Ngenator

Python 2.x dict.keys()のshacker's 1 の改善として、辞書のキーのリストコピーをPython 3で返します。 .x itは代わりにイテレータを返します。イテレータのサイズを変更することは賢明ではありません。バージョンセーフな実装の場合、リストにキャストするとサイズの問題を防ぐことができます

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

私の以前の答えはdict.viewkeys()の使用を提案しましたが、python 3.xでもイテレータを返します。

5
Robert Wisner

Djangoセッションで設定したキーをクリアできますが、ユーザーをログアウトせずにクリアするには、少し注意が必要です。request.session.flush()はユーザーをログアウトします。そしてrequest.session = {} inセッション辞書のすべてのキーを削除すると、ユーザーもログアウトされます。

したがって、ユーザーをログアウトせずにキーをクリアするには、アンダースコア文字で始まるキーを回避する必要があります。次のコードでトリックを実行します。

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_は内部的にCookieを使用します。また、ユーザーがサイトのURLを要求すると、そのユーザーのマシンに存在するCookieのみがサーバーに送信されます。したがって、_request.session_は常に現在のユーザーに関連付けられます。

したがって、これはサイトの他のユーザーに影響を与えることはありません。

また、古いセッションを削除して新しいセッションを作成し、この新しいセッションが現在のユーザーに関連付けられるflush()を使用しているため、現在のユーザーはログアウトされません。

flush()は内部でclear()delete()およびcreate()を使用します。

応答では、この新しいセッションのキーがCookieとして送信され、その後の要求では、この新しいセッションは正常に機能し続けます。

1
Akshar Raaj