我正试图将我们的代码迁移到Cloud NDB。 我们为每个客户都有单独的命名空间。
我如何才能为每个请求安全地切换命名空间?
我已经实现了 Flask 中间件,就像网站上的例子一样。迁移文件
命名空间是客户端的一个属性。所以当一个请求进来的时候,我从accesstoken中确定电子邮件,并确定这个用户属于哪个命名空间。然后我改变客户端的命名空间。
恐怕这个client.namespace属性不是线程安全的。而且我不想让用户看到彼此的数据。
client = ndb.Client()
def ndb_wsgi_middleware(wsgi_app):
def middleware(environ, start_response):
with client.context():
return wsgi_app(environ, start_response)
return middleware
def switch_user(email):
client = context_module.get_context().client
client.namespace = determine_namespace(email)
我可以将客户端的创建移到中间件内部,但我读到这将产生很多我们想要避免的开销。
此问题已在 python-ndb 库中得到解决。https:/github.comgoogleapispython-ndbpull388。
nampespace属性已经被移到了上下文级别,所以我现在可以根据请求来改变它。