使用 webapp2 会话作为名称空间名称。如何?

Using webapp2 session as namespace name. How?

我有一个基于学校的应用程序。每个租户都是一所不同的学校,每所学校的所有用户都使用相同的密码来访问该应用程序。

除此之外,每个学校用户都必须有一个 google 电子邮件才能访问该应用程序。因此,应用程序首先检查他们是 google 用户,检查他们是否是学校用户,最后检查他们的 google 电子邮件是否在学校用户列表中,然后才允许他们访问任何页面。

学校用户部分正在使用来自 webapp2 会话的会话数据来确保每个请求他们都有适当的访问权限

class Handler(webapp2.RequestHandler):
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()   

当用户登录时,我检查密码,然后创建一个会话,在每次请求时检查他们的密码/用户组合。

def check_u(self):
    try:
        uid = self.session.get('user')
        parent = self.session.get('school-id')
        udl = m.models.User.by_id(int(uid),parent)
        if uid and udl:
            return udl
        else:
            return False
    except (TypeError,AttributeError):
        return False

每个不同学校的父数据存储实体被称为 MetaSchool,我目前一直在使用它来确保学校之间没有数据泄漏。每个数据存储条目都使用此父会话密钥作为设置数据存储条目的一种方式,以 MetaSchool 作为父条目,然后再次使用此会话密钥读回此数据。

这个方法有效,但是很麻烦。我想使用名称空间作为分隔数据的方式,但想使用 Metaschool id 作为名称。

def namespace_manager_default_namespace_for_request():
    ### Here I need to get ------ parent = self.session.get('school-id')
    ### use this session to gain the MetaSchool key id
    ### Set this as the namespace name

基本上试图从文档中模拟以下场景

from google.appengine.api import users

def namespace_manager_default_namespace_for_request():
     # assumes the user is logged in.
     return users.get_current_user().user_id()

我在从 Handler 对象获取会话数据时遇到困难??? 有什么想法

这是我想出来的。

from google.appengine.api import namespace_manager
from webapp2_extras import sessions

def namespace_manager_default_namespace_for_request():
    session = sessions.get_store()
    s = session.get_session()
    name = s.get('key')
    if name:
        return name
    else:
        return namespace_manager.set_namespace('string')