我正在扩展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()
出于某种目的,我想获取特定用户的所有活动会话。我该怎么办?
答案 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提供了一个数据存储后端(后端选项为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')