获取所有活动的用户会话webapp2

时间:2019-04-04 11:25:55

标签: google-app-engine session webapp2

我正在扩展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 :(得分:0)

尝试使用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提供了一个数据存储后端(后端选项为securecookiedatastorememcache),但没有用户字段。

因此,您需要同时继承SessionDatastoreSessionFactory的子类才能添加它:

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')