Я разрабатываю многопользовательскую систему с использованием пространств имен.
Пользователи проходят аутентификацию через 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. Моя альтернативная идея состоит в том, чтобы извлечь все «глобальные» данные из облачного хранилища данных во внешний веб-сервис, но я бы предпочел избежать этого, если это возможно.
Совет принят с благодарностью. заранее спасибо