すべてのセッション変数をクリアしようとしていますが、現在のユーザーをログアウトしていません。
user = request.session.get('member_id', None)
request.session.flush()
request.session.modified = True
request.session['member_id'] = user
request.session.modified = True
これはサイトの他のユーザーにも影響しますか?
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']
Django <1.8のバージョンでは、 session.flush
セッションデータを削除し、セッションキーを再生成します。セッションキーは一意であるため、他のユーザーには影響しません。
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でもイテレータを返します。
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]
session_keys = list(request.session.keys())
for key in session_keys:
del request.session[key]
_request.session
_は内部的にCookieを使用します。また、ユーザーがサイトのURLを要求すると、そのユーザーのマシンに存在するCookieのみがサーバーに送信されます。したがって、_request.session
_は常に現在のユーザーに関連付けられます。
したがって、これはサイトの他のユーザーに影響を与えることはありません。
また、古いセッションを削除して新しいセッションを作成し、この新しいセッションが現在のユーザーに関連付けられるflush()
を使用しているため、現在のユーザーはログアウトされません。
flush()
は内部でclear()
、delete()
およびcreate()
を使用します。
応答では、この新しいセッションのキーがCookieとして送信され、その後の要求では、この新しいセッションは正常に機能し続けます。