为什么SESSION_EXPIRE_AT_BROWSER_CLOSE = True在浏览器关闭时将用户注销?

时间:2010-10-20 09:41:16

标签: django

根据Django文档,“如果SESSION_EXPIRE_AT_BROWSER_CLOSE设置为True,Django将使用浏览器长度的cookie - 一旦用户关闭其浏览器就会过期的cookie。如果您希望人们必须登录,请使用此每次他们打开浏览器。“

这就是我通过将以下行添加到我的settings.py文件(并重新启动服务器)所做的事情:

# Close the session when user closes the browser
SESSION_EXPIRE_AT_BROWSER_CLOSE = True

然后我登录到一个页面,检查用户是否经过身份验证,然后我关闭了浏览器。当我再次打开浏览器并访问同一页面时,它不会要求输入用户名和密码,因为它显然通过了以下测试:

def check_teacher(request):
    result = {}
    if request.user.is_authenticated():
        ...

我做错了什么或我错过了什么?有什么建议吗?

我在我的Ubuntu GNU / Linux 10.10系统上使用Django 1.3版pre-alpha SVN-13858,并使用Django开发服务器运行上述示例。

4 个答案:

答案 0 :(得分:20)

关闭标签页或窗口并不算作关闭浏览器。确保退出浏览器程序以结束浏览器会话。

如果这没有用,请在Firefox中使用FireBug或在Safari中使用Web Inspector在初始页面命中时仔细检查响应中的标题。初始页面命中可以是许多事情之一;当您第一次打开浏览器,注销时或清除cookie后立即。使用SESSION_EXPIRE_AT_BROWSER_CLOSE = True,您应该在标题中看到类似的内容:

Set-Cookie:sessionid=f4c06139bc46a10e1a30d5f0ab7773e2; Path=/

SESSION_EXPIRE_AT_BROWSER_CLOSE = False添加expires=...值时:

Set-Cookie:sessionid=a532f3d7dc314afc58e8f676ed72280e; expires=Wed, 03-Nov-2010 17:08:45 GMT; Max-Age=1209600; Path=/

如果由于重定向而很难看到Set-Cookie标题,您可以尝试使用django-debug-toolbar将重定向分解为多个页面。

答案 1 :(得分:6)

@istruble和@haasfsafas都是正确的。解决方案是

  1. 设置SESSION_EXPIRE_AT_BROWSER_CLOSE = True
  2. 删除django_session表中的行以清除可能导致混淆的任何会话。 (delete from django_session
  3. 确认必须关闭浏览器中的所有窗口和标签才能使会话过期。这是浏览器的行为;不是Django的行为。

答案 2 :(得分:1)

除非您再次运行manage.py syncdb,否则更改将不适用。

答案 3 :(得分:0)

您必须在DB中清理会话:

delete FROM django_session