Когда пользователь входит в систему, пометьте его как активного в хранилище данных, используйте 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()