Python 谷歌应用程序引擎api的范围是什么;s命名空间管理器?
我正在Google App Engine Python标准环境中使用Flask构建一个API,该环境通过多个域提供服务 API可用于存储数据和获取数据 我想使用云数据存储的多租户功能,仅在由访问API的域确定的名称空间中存储或获取数据 我能看到的唯一方法是使用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.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请求设置默认名称空间”