如何在 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 中关闭浏览器时清除本地存储?