会话在浏览器关闭时到期未正确设置django

时间:2015-03-27 07:59:40

标签: python django

我在settings.py中将SESSION_EXPIRE_AT_BROWSER_CLOSE设置为True并尝试获取该值,但它先返回True,然后再返回False。

在settings.py中

SESSION_EXPIRE_AT_BROWSER_CLOSE = True

在views.py

def login(request, *args, **kwargs):
    if request.method == 'POST':  
        print 'First call: is expired at the browser close', request.session.get_expire_at_browser_close() 

        if not request.POST.has_key('remember_me'):               
            request.session.set_expiry(settings.LOGIN_SESSION_TIMEOUT) 
            settings.SESSION_EXPIRE_AT_BROWSER_CLOSE = True  # just to makie sure          
            print 'Second call: is expired at the browser close', request.session.get_expire_at_browser_close()
   return auth_views.login(request, *args, **kwargs)

第一个调用返回True,但POST内的第二个调用返回False。发生了什么?

2 个答案:

答案 0 :(得分:2)

您可以设置到期日期,也可以在浏览器关闭时使会话过期。两者都做不到。

第二次调用get_expire_at_browser_close会返回False,因为您已拨打set_expiry

答案 1 :(得分:2)

文档实际上很清楚:

来自django/contrib/sessions/backends/base.py

def get_expire_at_browser_close(self):    
    """    
    Returns ``True`` if the session is set to expire when the browser    
    closes, and ``False`` if there's an expiry date. Use    
    ``get_expiry_date()`` or ``get_expiry_age()`` to find the actual expiry    
    date/age, if there is one.    
    """    
    if self.get('_session_expiry') is None:    
        return settings.SESSION_EXPIRE_AT_BROWSER_CLOSE    
    return self.get('_session_expiry') == 0    

SESSION_EXPIRE_AT_BROWSER_CLOSE是通过不在会话cookie上设置过期日期来实现的,这会导致在浏览器应用程序(而不是浏览器标签!)关闭时删除cookie。