2010-11-03 97 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,而不是服務器 - 活動會議恕我直言。