我正在尝试在python中为Google App Engine的所有数据库操作设置命名空间,但我无法完成它。
目前我的代码看起来像这样:
""" Set Google namespace """
if user:
namespace = thisUser.namespace
namespace_manager.set_namespace(namespace)
""" End Google namespace """
#Then i have all sorts of classes:
class MainPage(BaseHandler):
def get(self):
#code with DB operations like get and put...
class MainPage2(BaseHandler):
def get(self):
#code with DB operations like get and put...
class MainPage3(BaseHandler):
def get(self):
#code with DB operations like get and put...
app = webapp2.WSGIApplication([ ... ], debug=True, config=webapp2_config)
问题在于,在类中,所有数据库操作仍然在默认命名空间上完成(因此没有设置命名空间)。虽然我将命名空间设置在我的代码的最顶层。
当我打印变量“namespace”时,我也设置在代码的顶部,然后我会看到我想要使用的命名空间。
但是看起来Google App Engine在某个地方运行代码之前将名称空间重置为空。
所以现在我想知道是否有一种在某处设置名称空间的好方法。
目前我在所有“def”中都设置了这个:
class MainPage(BaseHandler):
def get(self):
namespace_manager.set_namespace(namespace)
#code with DB operations like get and put...
class MainPage(BaseHandler):
def get(self):
namespace_manager.set_namespace(namespace)
#code with DB operations like get and put...
etc...
这不是一个非常优雅的解决方案。
答案 0 :(得分:2)
您需要write a middleware来拦截请求,并根据您的应用逻辑设置命名空间。
答案 1 :(得分:1)
一个好的解决方案是添加一个钩子。这样的东西应该是有效的。
from google.appengine.api import apiproxy_stub_map
NAMESPACE_NAME = 'noname'
def namespace_call(service, call, request, response):
if hasattr(request, 'set_name_space'):
request.set_name_space(NAMESPACE_NAME)
apiproxy_stub_map.apiproxy.GetPreCallHooks().Append(
'datastore-hooks', namespace_call, 'datastore_v3')
您可以在main.py
或appengine_config.py
中添加。通过这种方式,钩子在加载实例期间被配置并保持其状态。
答案 2 :(得分:1)
您可以使用appconfig.py并定义namespace_manager_default_namespace_for_request()
阅读https://developers.google.com/appengine/docs/python/multitenancy/multitenancy,请参阅“设置当前命名空间”的第一部分