Я хочу ограничить вход в систему только одним активным сеансом, то есть если пользователь входит в систему с новым сеансом, старый сеанс должен быть завершен. я нашел много помощи на SO уже: here и hereРазрешение только одного активного сеанса на пользователя в приложении Django
Я реализовал решение промежуточного, с немного дополнительной проверки ...
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 runningerver) работает нормально, он запускает старую сессию ...
... но при использовании Apache (с mod_wsgi) это не работает!
Я пытался найти какую-либо информацию об этом, но не повезло до сих пор ...
Ближайший я нашел this, но это своего рода проблема «противоположного» ...
Любая помощь будет очень признательна.
Edit: я добавил отладочную печать перед удалением сессии ... вот отрывок из 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)
последние два с моментом, когда я вошел со второй сессией (Chromium)
... получается, что старая запись сеанса не удаляется ... ???
Я бегу по сравнению с точно такой же PostgreSQL, например, как я сделал с devserver ...
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()
Когда вы говорите «не работает», что именно не работает? Вы все еще видите старую сессию в БД? Если вы поместили вызов печати/регистрации непосредственно перед удалением 'Session', вы видите, что это выполнено в' mod_wsgi'? – AdamKG
@AdamKG: Спасибо, что указал мне в правильном направлении! –
Если сеансовым движком является cache_db, я думаю, нам также нужно вручную удалить ключ сеанса из кеша, не так ли? – Wesley