【问题标题】:Django request's session consistency across different browsersDjango 请求跨不同浏览器的会话一致性
【发布时间】:2019-06-20 21:37:22
【问题描述】:

我的会话引擎设置如下:

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,
    }
}

我用浏览器1去127.0.0.1:8000,可以成功登录。

然后我用Browser 2去127.0.0.1:8000也能成功登录。

现在我使用 Browser 1 转到 127.0.0.1:8000 并收到以下错误消息:

SuspiciousOperation at /

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

如何避免这个错误?用户应该能够使用他喜欢的任意数量的浏览器登录。我不介意他是否从非活动浏览器中注销,但错误是不可接受的。

【问题讨论】:

    标签: django django-sessions


    【解决方案1】:

    问题在于一个中间件确保只有一个会话可以同时处于活动状态。它是为会话 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 2015-03-28
      相关资源
      最近更新 更多