为所有数据库操作设置名称空间

时间:2012-07-09 08:31:32

标签: python google-app-engine

我正在尝试在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...

这不是一个非常优雅的解决方案。

3 个答案:

答案 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.pyappengine_config.py中添加。通过这种方式,钩子在加载实例期间被配置并保持其状态。

答案 2 :(得分:1)

您可以使用appconfig.py并定义namespace_manager_default_namespace_for_request()

阅读https://developers.google.com/appengine/docs/python/multitenancy/multitenancy,请参阅“设置当前命名空间”的第一部分