Управление глобальными данными в многопользовательском приложении Appengine с пространством имен.

Я разрабатываю многопользовательскую систему с использованием пространств имен.

Пользователи проходят аутентификацию через OpenID, а модель пользователя сохраняется в облачном хранилище данных. Пользователи будут сгруппированы в организации, также смоделированные в базе данных. Данные приложений должны быть разделены по организациям.

Итак, идея состоит в том, чтобы сопоставить пространства имен с «Организациями».

Когда пользователь входит в систему, его Организация просматривается и сохраняется в сеансе.

Промежуточное ПО WSGI проверяет сеанс и соответствующим образом устанавливает пространство имен.

Мой вопрос касается того, как лучше всего управлять переключением между данными, которые являются «глобальными» (т.е. пользователем и организацией) и данными приложения (в пространстве имен по организации)

Мой текущий подход заключается в использовании декораторов Python и менеджеров контекста для временного переключения на глобальное пространство имен для операций, которые обращаются к таким глобальным данным. например

standard_datastore_op()

with global_namespace():
    org = Organization.query(Organization.key=org_key)

another_standard_datastore_op(org.name)

or

@global_namespace
def process_login(user_id):
    user = User.get_by_id(user_id)

Это также означает, что у моделей есть KeyProperties между пространствами имен:

class DomainData(ndb.Model): # in the current user's namespace

    title = ndb.StringProperty()
    foreign_org = ndb.KeyProperty(Organization) #in the "global" namespace

Кажется ли это разумным подходом? Мне это кажется немного хрупким, но я подозреваю, что это потому, что я новичок в работе с пространствами имен в App Engine. Моя альтернативная идея состоит в том, чтобы извлечь все «глобальные» данные из облачного хранилища данных во внешний веб-сервис, но я бы предпочел избежать этого, если это возможно.

Совет принят с благодарностью. заранее спасибо


person patrickcd    schedule 27.07.2012    source источник
comment
Привет. Вы нашли лучшее решение? У меня такая же архитектура, и мне сложно понять, как использовать, например. Пользовательская модель в глобальном (для аутентификации) и в приватном (для внешних ключей) пространствах имен.   -  person Nikolay Baluk    schedule 23.06.2013


Ответы (1)


Декораторы — это прекрасный подход, преимущество которого заключается в четкой маркировке того, какие функции работают за пределами пространства имен организации.

def global_namespace(global_namespace_function):
  def wrapper():
    # Save the current namespace.
    previous_namespace = namespace_manager.get_namespace()

    try:
        # Empty string = default namespace, change to whatever you want to use as 'global'
        global_namespace = ''
        # Switch to 'global' namespace
        namespace_manager.set_namespace(global_namespace)

        # Run code that requires global namespace
        global_namespace_function()
    finally:
        # Restore the saved namespace.
        namespace_manager.set_namespace(previous_namespace)

  return wrapper

Кстати, у нас также есть документация по использованию пространств имен для многопользовательского режима. .

person Dan McGrath    schedule 29.12.2016