2010-11-03 87 views
2

我希望有人可以帮助我。Django - 检测会话开始和结束

我正在尝试在我的网站的主页上实现“在线用户数”计数器。我记得在ASP的恶劣日子里,我曾经能够用session.onstart和session.onend来保持一个计数器。

我该如何在Django中做到这一点?

干杯

丰富

+0

这是关于登录用户或所有用户的? – 2010-11-03 01:14:10

+0

这是关于'所有用户',我已登录柜台工作已经很明显该怎么做! – Rich 2010-11-03 02:16:15

回答

5
from django.contrib.sessions.models import Session 
import datetime 
users_online = Session.objects.filter(expire_date__gte = datetime.datetime.now()).count() 

这只作品,当然,如果你使用的数据库存储的会话。任何更深奥的东西,比如memcache,都需要你自己推出。

+1

您确定会话在用户关闭浏览器时得到清理吗?根据我的经验,他们甚至没有SESSION_EXPIRE_AT_BROWSER_CLOSE =真 – Rich 2010-11-03 02:13:54

+0

我也有一个覆盖设置的用户持久性机制。它不工作,因为我无法让会话删除。也许我会在这里一箭双雕! – Rich 2010-11-03 02:14:53

+1

不,当用户关闭浏览器时,它们不会被清理干净。但它们确实到期了,你应该检查一下;因此我的过滤器。你确切需要这个答案是什么?您应该在cron下每小时运行一次“./manage.py cleanup”以清除旧的会话。 – 2010-11-03 02:31:06

1

对不起,我不相信你可以得到一个准确的ASP/IIS计数。服务器根本无法分辨用户离开浏览器时在网站上打开而不做任何事情,浏览到不同页面或完全关闭浏览器。

即使会话cookie在浏览器关闭时过期,它仍然不会告诉服务器任何东西 - 浏览器现在已关闭,那么会怎么让服务器知道?这只是客户端Cookie已过期。

您可以做的最好的事情就是根据会议过期进行估算,正如Elf所建议的那样。

+1

很久以前,我使用ASP,但我似乎记得像session.onstart和session.onend事件是一个像globals.asp文件的东西。 – Rich 2010-11-10 07:12:06

+0

这是8年前,因为我上次使用它,所以我可能是错的,现在无论如何,它是ASP不是.net! – Rich 2010-11-10 07:12:56

8

django signals是非常方便的:

# this is in a models.py file 
from django.db.models.signals import pre_delete 
from django.contrib.sessions.models import Session 

def sessionend_handler(sender, **kwargs): 
    # cleanup session (temp) data 
    print "session %s ended" % kwargs.get('instance').session_key 

pre_delete.connect(sessionend_handler, sender=Session) 

你需要reguraly删除您的会议,因为他们可以留在数据库中,如果用户不会点击最常见的“登出”。只需添加这一个cron:

*/5 * * * * djangouser /usr/bin/python2.5 /home/project/manage.py cleanup 

还我通常将它添加到我的manage.py方便settings.py查找路径:

import sys 
import os 
BASE_DIR = os.path.split(os.path.abspath(__file__))[0] 
sys.path.insert(0, BASE_DIR) 

SESSION_EXPIRE_AT_BROWSER_CLOSE的作品,但只影响客户端的cookie,而不是服务器 - 活动会议恕我直言。