ログインしているユーザーにアクティブなセッションが1つしかないように制限したい、つまりユーザーが新しいセッションIDでログインする場合、古いセッションを終了する必要があります。 私はSOすでに上で多くの援助が見つかりました:私は...、これまでのところ...余分なチェックのビットで、とても良いDjangoアプリケーションでアクティブなセッションを1つだけ許可する
class OnlyOneUserMiddleware(object):
"""
Middleware to ensure that a logged-in user only has one session active.
Will kick out any previous session.
"""
def process_request(self, request):
if request.user.is_authenticated():
try:
cur_session_key = request.user.get_profile().session_key
if cur_session_key and cur_session_key != request.session.session_key:
# Default handling... kick the old session...
Session.objects.get(session_key=cur_session_key).delete()
if not cur_session_key or cur_session_key != request.session.session_key:
p = request.user.get_profile()
p.session_key = request.session.session_key
p.save()
except ObjectDoesNotExist:
pass
Djangoのdevサーバ(manage.py runserver)はすべて正常に動作し、古いセッションを起動します...
...しかし、Apache(mod_wsgi)を使用すると動作しません!
私はこれについての情報を見つけることを試みましたが、今のところ...
運が、私が見つけた最も近いthisありませんが、それは反対か」の問題のようなものです...
ご協力いただければ幸いです。
編集:私はセッションを削除する前に、デバッグプリントを追加... は、ここでは、Apacheのerror.logファイルからの抜粋です:
[Fri Jan 20 09:56:50 2012] [error] old key = f42885ccb7f33b6afcb2c18fca14f44a
[Fri Jan 20 09:56:50 2012] [error] new key = ce4cfb672e6025edb8ffcd0cf2b4b8d1
[Fri Jan 20 09:57:14 2012] [error] old key = f42885ccb7f33b6afcb2c18fca14f44a
[Fri Jan 20 09:57:14 2012] [error] new key = 0815c56241ac21cf4b14b326f0aa7e24
最初の二つの嘘は、私が最初のセッション(Firefoxで入力されたときからのもの)
最後の二つは、私は2番目のセッション(クロム)
に入ったときからのもの...それは...古いセッションレコードが削除されないことが判明します?私はdevserverで行ったように、私は正確に同じのPostgreSQLインスタンス対実行しているよ
...
EDIT2:これは、新しいSESSION_KEYがなかったとき、それが失敗した...私のコードにバグがあったことが判明しました
がここに固定されたコードだ...セッションで見つかった... try..exceptが正しい場所に今ある
class OnlyOneUserMiddleware(object):
"""
Middleware to ensure that a logged-in user only has one session active.
Will kick out any previous session.
"""
def process_request(self, request):
if request.user.is_authenticated():
cur_session_key = request.user.get_profile().session_key
if cur_session_key and cur_session_key != request.session.session_key:
# Default handling... kick the old session...
try:
s = Session.objects.get(session_key=cur_session_key)
s.delete()
except ObjectDoesNotExist:
pass
if not cur_session_key or cur_session_key != request.session.session_key:
p = request.user.get_profile()
p.session_key = request.session.session_key
p.save()
「うまくいきません」と言うと、正確には機能していないのは何ですか?あなたはまだDBの古いセッションを参照してください? 'Session'削除の直前にprint/logging呼び出しを置くと' mod_wsgi'で実行されたことが分かりますか? – AdamKG
@AdamKG:正しい方向に私を指してくれてありがとう! –
セッションエンジンがcache_dbの場合、セッションキーを手動でキャッシュから削除する必要があると思います。 – Wesley