3

名前空間を使用してマルチテナント システムを設計しています。

ユーザーは 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 サービスに抽出することですが、可能であればそれは避けたいと思います。

ありがたいアドバイスをいただきました。前もって感謝します

4

1 に答える 1

0

デコレータは完全に優れたアプローチであり、組織固有の名前空間の境界外で動作する機能を明確にラベル付けできるという利点もあります。

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

関連する注意事項として、マルチテネナシーのための名前空間の使用に関するドキュメントもあります。

于 2016-12-29T15:57:15.767 に答える