2

有没有一种快速简单的方法可以让所有当前登录到 web2py 应用程序的用户?我想向页面的管理员显示目前有多少非管理员用户登录。谢谢..

4

1 回答 1

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 时才更新.expiration 时间,默认为 3600 秒)。

于 2012-09-01T01:19:56.340 回答