Согласованность сеанса Django-запроса в разных браузерах - PullRequest
0 голосов
/ 20 июня 2019

У меня есть следующие настройки механизма сессии:

SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'
SESSION_SAVE_EVERY_REQUEST = True
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
        'TIMEOUT': 60*60,
    }
}

Я перехожу к 127.0.0.1:8000 с Браузер 1 и могу успешно войти в систему.

Затем я перехожу к 127.0.0.1:8000 с Browser 2 и также могу успешно войти в систему.

Теперь я перехожу к 127.0.0.1:8000 с Browser 1 иполучите следующее сообщение об ошибке:

SuspiciousOperation at /

The request's session was deleted before the request completed.
The user may have logged out in a concurrent request, for example.

Как можно избежать этой ошибки?Пользователь должен иметь возможность войти в систему с любым количеством браузеров.Я не против, если он выйдет из неактивных браузеров, но ошибка не допустима.

1 Ответ

0 голосов
/ 20 июня 2019

Проблема заключалась в наличии промежуточного программного обеспечения, обеспечивающего одновременную активность только одного сеанса.Он был записан только для файлов cookie сеанса, и после его переписывания проблема исчезла:

from importlib import import_module
class OnlyOneSessionMiddleware:
    """
    Middleware to ensure that a logged-in user only has one session active.
    Will kick out any previous session. 
    """
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        if request.user.is_authenticated:
            cur_session_key = request.user.profile.session_key
            if cur_session_key and cur_session_key != request.session.session_key:
                # Default handling: Kick out the old session...
                SessionStore = import_module(settings.SESSION_ENGINE).SessionStore
                s = SessionStore(session_key=cur_session_key)
                s.delete()
                messages.add_message(request, messages.INFO, 'You have now been automatically logged out from your other Cableizer session.')
            if not cur_session_key or cur_session_key != request.session.session_key:
                request.user.profile.session_key = request.session.session_key
                request.user.profile.save()
        return response
...