Django - 检测会话的开始和结束

时间:2010-11-03 01:03:28

标签: django

我希望有人可以帮助我。

我正在尝试在我网站的主页上实现“在线用户数”计数器。我记得在ASP过去的糟糕时期,我曾经能够通过session.onstart和session.onend保持计数器。

我如何在Django中完成?

干杯

4 个答案:

答案 0 :(得分:9)

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)

如果用户没有点击最常见情况下的“退出”,那么您需要定期删除会话,因为他们可以留在数据库中。只需将其添加到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,而不影响服务器活动会话恕我直言。

答案 1 :(得分:5)

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

当然,这只适用于Sessions的数据库存储。任何更深奥的东西,比如memcache,都需要你自己动手。

答案 2 :(得分:1)

抱歉,我不相信你能准确了解ASP / IIS。服务器根本不可能告诉用户在没有做任何事情的情况下让浏览器在网站上打开,导航到另一个页面或完全关闭浏览器之间的区别。

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

你可以做的最好的事情是根据会议的到期时间进行估算,正如Elf建议的那样。

答案 3 :(得分:1)

如果您需要跟踪活跃用户,可以尝试http://code.google.com/p/django-tracking/