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

Ric*_*ich 4 django

我希望有人可以帮助我.

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

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

干杯

丰富

juj*_*ule 9

django信号非常方便:

# 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)
Run Code Online (Sandbox Code Playgroud)

您需要定期删除会话,因为如果用户没有点击最常见情况下的"注销",他们可以留在数据库中.只需将其添加到cron:

*/5 * * * * djangouser /usr/bin/python2.5 /home/project/manage.py cleanup
Run Code Online (Sandbox Code Playgroud)

另外我通常将它添加到我的manage.py中以便于settings.py路径查找:

import sys
import os
BASE_DIR = os.path.split(os.path.abspath(__file__))[0]
sys.path.insert(0, BASE_DIR)
Run Code Online (Sandbox Code Playgroud)

SESSION_EXPIRE_AT_BROWSER_CLOSE有效,但仅影响客户端cookie,而不影响服务器活动会话IMHO.


Elf*_*erg 5

from django.contrib.sessions.models import Session
import datetime
users_online = Session.objects.filter(expire_date__gte = datetime.datetime.now()).count()
Run Code Online (Sandbox Code Playgroud)

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

  • 不,遗憾的是,当用户关闭浏览器时,它们不会被清理干净。但是它们确实会过期,您应该检查一下;因此我的过滤器。你需要这个答案有多准确?您应该在 cron 下每小时运行一次“./manage.py cleanup”,以清除旧会话。 (2认同)