When a user logs in, flag that user as active within the datastore, use memcache to store whatever session info you want, then run a regular job that checks the active users and saves the data from inactive sessions (ie older than 20 mins or so) to the datastore.
Here's an example that tracks a user's start and end time:
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()