我想从我的GAE应用程序跟踪我的用户-谁登录,他们登录了多长时间,他们从哪里登录等。我想知道使用Google提供的身份验证机制来做到这一点的好方法。
我可以很容易地在app.yaml
中添加装饰器和约束,以确保只有在用户登录时才能访问特定的端点;然而,这并没有真正给我所需要的信息。
显然,谷歌在后台做会话管理——有可能以任何方式与之交谈吗?如果没有,是否有其他经过尝试和测试的方法,我可以利用这些方法来跟踪上述信息?
当用户登录时,将该用户标记为数据存储中的活动用户,使用memcache存储所需的任何会话信息,然后运行一个常规作业,检查活动用户并将非活动会话(即超过20分钟左右)的数据保存到数据存储中。
下面是一个跟踪用户开始和结束时间的示例:
def setUserSession(user):
date = datetime.datetime.today()
user_session = memcache.get("UserSession%s" % user.user_id())
if user_session is not None:
user_session = user_session.split(",")
memcache.replace("UserSession%s" % user.user_id(),"%s,%s" %(user_session[0],date.strftime("%Y-%m-%d %H:%M:%S")))
else:
memcache.set("UserSession%s" % user.user_id(),"%s,%s" %(date.strftime("%Y-%m-%d %H:%M:%S"), date.strftime("%Y-%m-%d %H:%M:%S")))
profile = db.GqlQuery("SELECT * FROM UserProfile WHERE User = :1", user).get()
if profile:
profile.LastSession = date
profile.IsActive = True
profile.put()
else:
profile = UserProfile()
profile.User = user
profile.FirstSession = date
profile.LastSession = date
profile.IsActive = True
profile.put()
def collectUserSessions():
active_users = db.GqlQuery("SELECT * FROM UserProfile WHERE IsActive = :1", True)
for u in active_users:
session = memcache.get("UserSession%s" % u.User)
if session:
session = session.split(',')
last_active = parseDate(session[1]) #parses string into datetime object
if date - datetime.timedelta(minutes=20) > last_active:
record = SessionHistory()
record.User = u.User
record.SessionStart = parseDate(session[0])
record.SessionEnd = last_active
record.put()
memcache.delete("UserSession%s" % u.User)
u.LastSession = last_active
u.IsActive = False
u.put()
else:
u.IsActive = False
u.put()