在Django中检测浏览器关闭时的用户注销

时间:2012-10-07 11:09:35

标签: django django-sessions

我们有一个用于某些数值计算的Web服务。它具有注册模式,用户必须注册才能通过邮件发送结果。

我们希望跟踪用户保持登录的时间。成功注册后,登录时间将写入数据库。注册不是永久性的,仅用于单个会话,用于获取用户电子邮件。

有几种情况可能:

用户通过注销按钮正常退出。 最简单的解决方案在数据库中写下时间和注销,然后删除会话。

用户按会话到期退出。 我打算用一个脚本来检查所有没有设置注销时间的数据库条目,如果当前时间 - 登录时间>到期时间将数据库中的注销时间写为登录时间+到期时间

用户通过浏览器关闭注销。 会话将get_expire_at_browser_close()设置为True。但我不知道服务器如何检测浏览器关闭。

想法,评论家,评论?

1 个答案:

答案 0 :(得分:6)

在django会话中间件中,如果我们想要SESSION_EXPIRE_AT_BROWSER_CLOSE:

,这些行控制会话到期
if settings.SESSION_EXPIRE_AT_BROWSER_CLOSE:
    max_age = None
    expires = None

服务器不必检测任何内容,因为根据this page,应该在客户端删除没有设置max_age或expires的cookie:

  

通过设置其中任何一个,cookie将一直持续到它的时间用完为止,否则 - 如果你没有设置 - cookie将一直持续到你关闭浏览器(“会话cookie”)。

修改

跟踪用户在线时长的一种方法是使用将不时ping服务器的javascript。只有当用户在浏览器中打开页面并且每个ping服务器都应该为用户更新上次看到的在线值时,才会发生这种情况。

当用户关闭浏览器会话结束时。下次用户登录服务器时可以计算上次访问上次在线访问 - 上次登录时间的持续时间。

更简单的解决方案,不使用任何javascript:上次在线看到可以使用简单的自定义中间件在每个用户请求上更新。