Получить все активные сессии пользователя webapp2 - PullRequest
0 голосов
/ 04 апреля 2019

Я расширяю способ отправки, как указано в документации по Webapp2 Sessions: https://webapp2.readthedocs.io/en/latest/_modules/webapp2_extras/sessions.html#SessionStore

def dispatch(self):
    # Get a session store for this request.
    self.session_store = sessions.get_store(request=self.request)

    try:
        # Dispatch the request.
        webapp2.RequestHandler.dispatch(self)
    finally:
        # Save all sessions.
        self.session_store.save_sessions(self.response)

    @webapp2.cached_property
    def session(self):
        # Returns a session using the default cookie key.
        return self.session_store.get_session()

Я хочу получить все активные сеансы определенного пользователя для какой-либо цели.Как мне это сделать?

1 Ответ

0 голосов
/ 04 апреля 2019

Попробуйте модель 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')
...