2012-08-31 133 views

回答

9

請注意,「當前登錄」不是一個明確的概念。您可以登錄,但隨後離開計算機或關閉瀏覽器。在這種情況下,你還在登錄嗎?你可能不應該被算作登錄,但服務器不知道你走開了或關閉了瀏覽器。 Auth系統確實在auth_events表中記錄了登錄和註銷事件,因此一種選擇是查找在定義的時間段內登錄但未顯式註銷的所有用戶。請注意,這可能會誇大登錄用戶的數量,因爲有些用戶可能已經離開您的網站而未顯式註銷。以下是一些代碼:

import datetime 
limit = request.now - datetime.timedelta(minutes=30) 
query = db.auth_event.time_stamp > limit 
query &= db.auth_event.description.contains('Logged-') 
events = db(query).select(db.auth_event.user_id, db.auth_event.description, 
    orderby=db.auth_event.user_id|db.auth_event.time_stamp) 
users = [] 
for i in range(len(events)): 
    last_event = ((i == len(events) - 1) or 
        events[i+1].user_id != events[i].user_id) 
    if last_event and 'Logged-in' in events[i].description: 
     users.append(events[i].user_id) 
logged_in_users = db(db.auth_user.id.belongs(users)).select() 

以上提供了所有在過去30分鐘內登錄但未明確登出的用戶。

更復雜的方法將涉及跟蹤已登錄的用戶的請求,以確定誰正在主動使用該應用程序。您可以緩存存儲每個登錄用戶最近請求的時間戳的字典。當請求報告時,在最近的時間範圍內向用戶顯示時間戳(並用較舊的時間戳清除用戶以防止緩存變得太大)。

另一種選擇是檢查會話文件。確定在某個時間段內已被修改的會話。其中,找到包含「auth」對象的對象,並檢查auth.last_visit上次請求的時間(實際上,auth.last_visit只會在上次訪問超過auth.settings的1/10時更新。吸氣時間,默認爲3600秒)。

+0

嘿安東尼非常感謝你的回答,這真的很詳盡,完整。我肯定會嘗試,並與結果更新.. –

+0

是的,這做了伎倆..真棒安東尼感謝.. –