2010-10-20 156 views
21

根据Django文档,“如果SESSION_EXPIRE_AT_BROWSER_CLOSE设置为True,Django将使用浏览器长度的cookie - 一旦用户关闭浏览器就会过期的cookies。如果您希望用户必须每次都登录他们打开浏览器。“为什么SESSION_EXPIRE_AT_BROWSER_CLOSE = True在浏览器关闭时将用户注销?

和通过添加以下行到我的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开发服务器运行上述示例。

+1

在您将其更改为会话之前,您可能已经在浏览器中存储了长寿命的cookie。尝试删除您的Cookie。 – 2010-10-20 10:12:25

+0

它的工作,但只有一次:(我删除了我的Firefox中的Cookie和活动登录(使用工具 - >清除最近的历史记录),然后关闭浏览器,当我试图再次访问该页时,它要求输入用户名和密码。然后关闭浏览器,然后再次打开它,访问相同的页面,但这次它没有再问我关闭并重新打开了几次,不幸的是,它再也没有让我再次登录过我的网站 – 2010-10-20 10:33:54

回答

19

关闭选项卡或窗口不会算作关闭浏览器。确保您退出浏览器程序以结束浏览器会话。

如果这样做没有帮助,请在firefox中使用FireBug或在Safari中使用Web Inspector,以在初始页面击中的响应中再次检查标题。最初的页面击中可能是许多事情之一;当你第一次打开浏览器,当你注销或立即清除cookie后。随着SESSION_EXPIRE_AT_BROWSER_CLOSE = True你应该看到在标题是这样的:

Set-Cookie:sessionid=f4c06139bc46a10e1a30d5f0ab7773e2; Path=/ 

SESSION_EXPIRE_AT_BROWSER_CLOSE = Falseexpires=...值将被添加:

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

如果你有一个很难看到Set-Cookie头,因为您重定向可以尝试使用django-debug-toolbar将重定向分成多个页面。

+0

这种情况有点清晰我现在:当我保持包含我的Django应用程序的选项卡打开并告诉Firefox“下次启动时保存我的选项卡和窗口”,然后关闭并重新启动Firefox,该选项卡也打开,我可以继续在应用程序内部,而不必登录。但是,如果我关闭该标签,然后退出Firefox(并再次告诉它保存我的标签),重新启动并打开一个新标签,访问应用程序的页面,然后我被迫登录。 – 2010-10-21 14:58:40

+1

我从未看过FF的下一次保存行为,但它听起来像它可能跨浏览器实例存储cookie。仔细检查您在每个FF实例之间发送的标题。我不会担心太多。如果你仍然好奇,在这个页面上关于cookies的讨论暗示了FF可能会存储所有的cookies:https://wiki.mozilla.org/Session_Restore – istruble 2010-10-21 16:18:02

+0

是的,它似乎存储它们(我找不到任何对于我在上面评论中描述的行为的其他解释)。 – 2010-10-22 08:14:45

1

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

0

你必须清理会议在DB:

delete FROM django_session 
+2

我想你不需要'where 1 = 1'来删除所有行,'delete FROM django_session'就够了。 – 2012-05-29 13:59:28

4

@istruble和@haasfsafas都是正确的。解决的办法是

  1. SESSION_EXPIRE_AT_BROWSER_CLOSE = True
  2. 删除行的django_session表中清除可能导致混乱的任何会议。 (delete from django_session
  3. 意识到必须关闭浏览器中的所有窗口和选项卡才能使会话过期。这是浏览器行为;不是Django的行为。
相关问题