【问题标题】:Using webapp2 session as namespace name. How?使用 webapp2 会话作为命名空间名称。如何?
【发布时间】:2015-08-26 21:37:38
【问题描述】:

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

除此之外,每个学校用户如果想要访问该应用程序,还必须拥有一个谷歌电子邮件。所以应用程序首先检查他们是谷歌用户,检查他们是否是学校用户,最后在他们被允许访问任何页面之前检查他们的谷歌电子邮件是否在学校用户列表中。

学校用户部分正在使用来自 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 对象获取会话数据??? 有什么想法

【问题讨论】:

    标签: google-app-engine session namespaces webapp2


    【解决方案1】:

    这是我想出来的。

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

    【讨论】:

    • 如果这适合您,请按照正常的 stackoverflow 礼仪接受这个自我回答,谢谢
    • 是的,但必须等待几天
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 2014-12-03
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多