获取所有已登录的Web2py用户

3
有没有一种快速简便的方法来获取当前已登录到web2py应用程序的所有用户? 我想向页面管理员展示此时有多少非管理员用户已登录。谢谢。
1个回答

10

请注意,“当前已登录”不是一个明确定义的概念。您可以登录,但然后离开计算机或关闭浏览器。在这种情况下,您仍然登录吗?您可能不应该被视为已登录,但服务器不知道您已经离开或关闭了浏览器。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.settings.expiration时间的1/10时,即3600秒为默认值时,auth.last_visit才会更新)。


嘿,安东尼,非常感谢你的回答,它真的很详细和完整。我一定会尝试并更新结果。 - Juan Ignacio Galan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接