Django和AWS上的意外会话超时

时间:2018-09-19 07:28:36

标签: django amazon-web-services nginx amazon-elb

我需要帮助来了解部署在AWS上的Django Web应用程序上意外会话超时的原因。我已经搜寻了几天,但仍然无法解决。你能给我任何想法吗?

  

目标

     

将会话超时设置为30分钟(30分钟未重新加载会导致   自动注销)

     

当前情况

     

当前,在谷歌浏览器上显示的session_id似乎正确。   但是,在此之前,意外退出了自动注销。几乎   在最后一次请求时间之后的2到3分钟之间。

session_id and its expire time shown on Google Chrome Application Cookie

settings.py 中,所有与会话相关的环境变量的定义如下

# Application definition
INSTALLED_APPS = [
    ...
    'django.contrib.sessions', # default sessions app is included
    ...
]

MIDDLEWARE = [
    ...
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    ...
    'recommend.middlewares.session_manage.SessionManageMiddleware', 
    # Sessions manage middleware named session_manage.py is also included. Also shown below.
]

SESSION_TIMEOUT_MINUTE = 30

session_manage.py

process_request()每次给出请求时都会执行,但是如果SESSION_TIMEOUT_MINUTE小于2,则似乎可以正常工作。

DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S'
SESSTION_TIMEOUT = settings.SESSION_TIMEOUT_MINUTE * 60

class SessionManageMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        self.process_request(request)
        response = self.get_response(request)
        return response

    def process_request(self, request):
        if not request.user.is_authenticated():
            return

        if 'last_touch' not in request.session:
            request.session['last_touch'] = datetime.now().strftime(DATETIME_FORMAT)
        elif (datetime.now() - datetime.strptime(request.session['last_touch'],
                                                 DATETIME_FORMAT)
              > timedelta(seconds=SESSTION_TIMEOUT)):
            auth.logout(request)
        else:
            request.session.modified = True
            request.session.set_expiry(SESSTION_TIMEOUT)
            request.session['last_touch'] = datetime.now().strftime(DATETIME_FORMAT)

除此之外,在 nginx.conf 中,我知道这是相关的,但是 keepalive_timeout 设置为

keepalive_timeout  65;

此外,在 AWS负载平衡器中,空闲超时设置为 600秒

About the settings of AWS load balancer

如果您有解决此问题的任何提示,请给我发消息。

谢谢。

0 个答案:

没有答案