如何在 django 中关闭浏览器上的会话

Posted

技术标签:

【中文标题】如何在 django 中关闭浏览器上的会话【英文标题】:How to kill a session on browser close in django 【发布时间】:2013-12-08 08:39:40 【问题描述】:

我正在为我的应用程序使用 Python-Django。我想在用户关闭浏览器时终止会话,并希望将会话终止或浏览器关闭时间存储在数据库中。 当用户通过设置从浏览器中删除会话 cookie 来关闭浏览器时,Django 会话提供了使会话过期的机制

 SESSION_EXPIRE_AT_BROWSER_CLOSE=True

在 settings.py 文件中。它从用户浏览器中删除会话 cookie。我可以在后端或 django 中获得此事件吗?或者我如何通过 ajax 向 Django 服务器传递一条消息,表明浏览器已关闭并且会话 cookie 已被删除。告诉我是否可以通过 django 或如何使用 javascript 来完成

【问题讨论】:

【参考方案1】:

为了在卸载之前进行 ajax 调用,恐怕你会像事件所期望的那样向用户显示一个烦人的警报框:

Date.prototype.timeNow = function()
     return ((this.getHours() < 10)?"0":"") + this.getHours() +":"+ ((this.getMinutes() < 10)?"0":"") + this.getMinutes() +":"+ ((this.getSeconds() < 10)?"0":"") + this.getSeconds();
;

$(window).bind("beforeunload", function (e) 
    var timeNow = new Date().timeNow(); 
    $.post( "api/closingTime",  "closingTime": timeNow  );
    return "Thanks for your visit";
);   

这也有点问题,好像用户决定点击停留在页面上发布请求仍然继续

【讨论】:

谢谢 XGreen,SESSION_EXPIRE_AT_BROWSER_CLOSE=True。在 Django 中使用此方法,cookie 在关闭时会自动从浏览器中删除。我只是想向 Django 服务器发送一个 ajax 请求,以便我获得请求到来的当前时间并将该时间存储到数据库。 Thanx Xgreen,我没试过你的方法,因为我试过这个 window.onbeforeunload = function() alert("hey ur leave this site") return "Hey, you're leave the网站。再见!"; ;但即使我点击一个链接,我每次都会提醒我或调用该方法。表示当一个 url 改变这个方法被调用。【参考方案2】:

你可以使用这样的信号

  from django.contrib.auth.signals import user_logged_out


  def do_stuff(sender, user, request, **kwargs):
      whatever...

  user_logged_out.connect(do_stuff)

请参阅 django 文档:https://docs.djangoproject.com/en/dev/ref/contrib/auth/#module-django.contrib.auth.signals 和此处http://docs.djangoproject.com/en/dev/topics/signals/

【讨论】:

此信号仅在用户注销时有效。但如果他不注销就关闭浏览器则不会

以上是关于如何在 django 中关闭浏览器上的会话的主要内容,如果未能解决你的问题,请参考以下文章

当我在 Android Web 浏览器中关闭运行 CodeIgniter Web 应用程序的 Android 应用程序时,CodeIgniter 会话不会关闭

即使在 Flask 中关闭浏览器后,如何将一个会话变量存储一段时间?

如何在关闭特定选项卡而不是在 Angular 2 中关闭浏览器时清除本地存储?

如何在js中关闭用户浏览器选项卡/窗口[重复]

如何使用 Java 在 Selenium WebDriver 中关闭子浏览器窗口

如何在 c# 中关闭任何浏览器时从 XMPP 注销?