Попробуйте модель UserToken
.
from webapp2_extras.appengine.auth.models import UserToken
def all_sessions_for_user(user, _limit=100):
return UserToken.query(UserToken.user == str(user.key.id()).fetch(limit=_limit)
РЕДАКТИРОВАТЬ - ОПЦИЯ 2
Тогда, я считаю, что единственный способ - это определить собственный бэкэнд session_store, скорее всего, используя хранилище данных.Существует серверная часть хранилища данных, которую предоставляет webapp2 (опции серверной части securecookie
, datastore
и memcache
), но у нее нет пользовательского поля.
Так что вам нужно будет создать подкласс для обоих Session
и DatastoreSessionFactory
, чтобы добавить его:
from webapp2_extras import auth
from webapp2_extras.appengine.sessions_ndb import Session, DatastoreSessionFactory
class MySession(Session):
user_id = ndb.KeyProperty(User)
class MyDatastoreSessionFactory(DatastoreSessionFactory):
session_model = MySession
def save_session(self, response):
"""extract user_id from self.session.data and pass it to self.session_model constructor"""
if self.session is None or not self.session.modified:
return
deserialized_session = auth.get_auth().store.deserialize_session(self.session.data)
self.session_model(id=self.sid, data=dict(self.session), user_id=deserialized_session['user_id'])._put()
self.session_store.save_secure_cookie(response, self.name, {'_sid': self.sid}, **self.session_args)
А затем, когда вы звоните get_session()
, вам просто нужно указать новую фабрику бэкэнда:
self.session_store.get_session(factory=MyDatastoreSessionFactory')