Я хочу ограничить вошедших в систему пользователей только одним активным сеансом, т.е. если пользователь входит в систему с новым идентификатором сеанса, старый сеанс должен быть завершен. Я уже нашел много помощи по SO: здесь и здесь
Я реализовал решение промежуточного программного обеспечения с небольшой дополнительной проверкой...
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) это не работает!
Я пытался найти какую-либо информацию об этом, но пока безуспешно...
Самое близкое, что я нашел, это это, но это своего рода "противоположная" проблема ...
Любая помощь приветствуется.
Изменить: я добавил отладочную печать перед удалением сеанса... вот фрагмент из журнала ошибок Apache:
[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)
... получается, что старая запись Session не удаляется... ???
Я использую тот же самый экземпляр 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()
Session
, вы увидите, что он выполняется подmod_wsgi
? - person AdamKG   schedule 19.01.2012user.get_profile()
? - person guival   schedule 02.01.2017