2

私は、複数のドメインを介して提供されるGoogle App Engine Python標準環境でFlaskを使用してAPIを構築しています。Google App Engine APIの名前空間マネージャーの範囲は何ですか?

APIは、データの保存とデータの取得に使用できます。

クラウドデータストアのマルチテナント性を使用して、APIにアクセスするドメインによって決定される名前空間内のデータのみを格納または取得したいと考えています。

私が見ることができる唯一の方法は、google.appengine.api.namespace_managerを使用して、要求時またはI/O時のコンテキストマネージャで名前空間を設定することです。

私はこのコンテキストマネージャ書きました:

@contextmanager 
def multitenancy_namespace(namespace): 
    original_namespace = namespace_manager.get_namespace() 
    if namespace: 
     new_namespace = to_namespace_safe_url(namespace) 
     namespace_manager.set_namespace(new_namespace) 

    yield 

    namespace_manager.set_namespace(original_namespace) 

をそして期待どおりに動作します。

私の心配はnamespace_managerの範囲です。私はこれについてのドキュメントを見つけることができませんでした。私のAPIは、スレッドとnamespace_manager.set_namespace(...)によって設定されるように、名前空間がグローバルであると仮定すると、> 1000人のユーザが同時に使用される場合

、私はいくつかの衝突を期待 - データが間違った名前空間に格納されている別の要求が最初の要求の後set_namespaceと呼ばれるので、最初の要求がI/Oを実行する前に行われました。

namespaceのスコープは少なくとも私のFlaskアプリケーションには十分である個々のスレッドに限定されていると私に伝えられるスレッドテストhereを書きました。

ただし、ですnamespace_managerのコンテキスト? set_namespaceは実際に何をしていますか?名前空間の設定はどこに保存されていますか?名前空間の衝突になる可能性のあるユースケースはありますか?

答えて

1

あなたがnamespace_manager.set_namespace(...)source codeに見れば、あなたはそれが環境変数に名前空間の設定によってそれをしない表示されます:スレッドがコンテキストを切り替えたとき

def set_namespace(namespace): 
    """Set the default namespace for the current HTTP request. 
    Args: 
    namespace: A string naming the new namespace to use. A value of None 
     will unset the default namespace value. 
    """ 
    if namespace is None: 
    os.environ.pop(_ENV_CURRENT_NAMESPACE, None) 
    else: 
    validate_namespace(namespace) 
    os.environ[_ENV_CURRENT_NAMESPACE] = namespace 

AppEngineのは、必要に応じて&は、環境変数を復元するバックアップ。彼らは要求がユーザのコードに対して不透明になるように制限されていることが保証されています。私はこれについてのドキュメントがあるかどうか覚えていない、私はいくつかのフォーラムのスレッドでこれを学んだと思う。

コメントSet the default namespace for the current HTTP requestは暗黙のうちにこれを確認しています。

私たちは数年前にwww.myclasses.orgでそれを使用しています。これは問題ではありません。

リラックスして、マルチスレッド環境で安全に使用できます!

+0

明らかに、ドキュメントのようなものは見当たりませんでした。説明してくれてありがとう! – Charles

+1

ちょっとややこしい。このメソッドのコメントは確かに保証されています: "" "現在のHTTPリクエストのデフォルト名前空間を設定してください。" –

関連する問題