Разрешение только одного активного сеанса для каждого пользователя в приложении Django

Я хочу ограничить вошедших в систему пользователей только одним активным сеансом, т.е. если пользователь входит в систему с новым идентификатором сеанса, старый сеанс должен быть завершен. Я уже нашел много помощи по 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)

. .. оказывается, что старая запись сеанса не удаляется ... ???

Я использую тот же экземпляр PostgreSQL, что и сервер разработчика ...

Edit2: Получилось выяснил, что мой код был ошибочным ... он не удался, когда новый Session_key не был найден в Session ...

вот фиксированный код ... 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()

23
задан Community 23 May 2017 в 12:01
поделиться