Python 谷歌应用程序引擎api的范围是什么;s命名空间管理器?

Python 谷歌应用程序引擎api的范围是什么;s命名空间管理器?,python,python-2.7,google-app-engine,google-cloud-datastore,Python,Python 2.7,Google App Engine,Google Cloud Datastore,我正在Google App Engine Python标准环境中使用Flask构建一个API,该环境通过多个域提供服务 API可用于存储数据和获取数据 我想使用云数据存储的多租户功能,仅在由访问API的域确定的名称空间中存储或获取数据 我能看到的唯一方法是使用google.appengine.api.namespace\u manager在请求时或在I/O时在上下文管理器中设置名称空间 我写了这个上下文管理器: @contextmanager def multitenancy_namespace

我正在Google App Engine Python标准环境中使用Flask构建一个API,该环境通过多个域提供服务

API可用于存储数据和获取数据

我想使用云数据存储的多租户功能,仅在由访问API的域确定的名称空间中存储或获取数据

我能看到的唯一方法是使用
google.appengine.api.namespace\u 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)
它的工作原理与预期一致

我担心的是
名称空间管理器的范围。我还没有找到任何关于这方面的文件

如果我的API是线程化的,并且由>1000个用户同时使用,假设
名称空间管理器.set\u名称空间(…)
设置的名称空间是全局的,我会预期一些冲突-数据存储在错误的名称空间中,因为在第一个请求之后另一个请求称为
set\u名称空间
,但在第一个请求执行I/O之前

我编写了一个通过的线程测试,它告诉我
名称空间
的范围至少限于单个线程(这对于我的Flask应用程序来说已经足够好了)

但是
名称空间管理器的上下文是什么?
set\u namespace
实际上做什么?名称空间设置保存在哪里?是否存在可能发生名称空间冲突的用例?

如果您查看
名称空间管理器。设置名称空间(…)
您将看到它通过将名称空间设置为环境变量来实现:

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会根据需要备份和恢复环境变量。它们保证是有请求限制的,所以对用户代码来说是不透明的。我不记得是否有这方面的文档,我想我是在某个论坛帖子上学到的

注释
设置当前HTTP请求的默认名称空间
隐式地确认了这一点

我们在几年前就开始使用它了,它从来都不是一个问题


所以放松点,在多线程环境中使用它是安全的

绝对没有在文档中看到过类似的内容,谢谢解释!嗯,有点棘手。不过,该方法的注释有点令人放心:“为当前HTTP请求设置默认名称空间”