名前空間を使用してマルチテナント システムを設計しています。
ユーザーは OpenID 経由で認証され、ユーザー モデルは Cloud Datastore に保存されます。ユーザーは組織にグループ化され、データベースでもモデル化されます。アプリケーション データは、組織ごとに分割する必要があります。
したがって、名前空間を「組織」にマップするという考え方です。
ユーザーがログインすると、組織が検索され、セッションに保存されます。
WSGI ミドルウェアはセッションを検査し、それに応じて名前空間を設定します。
私の質問は、「グローバル」なデータ (つまり、ユーザーと組織) とアプリケーション データ (組織によって名前空間が設定されている) の間の切り替えを管理する最善の方法に関するものです。
私の現在のアプローチは、python デコレーターとコンテキスト マネージャーを使用して、そのようなグローバル データにアクセスする操作のためにグローバル名前空間に一時的に切り替えることです。例えば
standard_datastore_op()
with global_namespace():
org = Organization.query(Organization.key=org_key)
another_standard_datastore_op(org.name)
また
@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 で名前空間を操作するのに慣れていないためだと思います。私の別のアイデアは、すべての「グローバル」データを Cloud Datastore から外部 Web サービスに抽出することですが、可能であればそれは避けたいと思います。
ありがたいアドバイスをいただきました。前もって感謝します