首页 > 解决方案 > 获取所有活动用户会话 webapp2

问题描述

我正在扩展 Webapp2 会话文档中指定的调度方法: 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()

我想出于某种目的获取特定用户的所有活动会话。我怎么做?

标签: google-app-enginesessionwebapp2

解决方案


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

推荐阅读