0

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

这样做的问题是,在类中,所有 DB 操作仍然在默认命名空间上完成(就好像没有设置命名空间一样)。尽管我在代码的最顶部设置了命名空间。

当我打印变量“命名空间”(我也在代码顶部设置)时,我确实可以看到我希望使用的命名空间。

但看起来 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...

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

4

3 回答 3

2

您需要编写一个中间件来拦截请求并根据您的应用程序逻辑设置命名空间。

于 2012-07-09T08:50:23.950 回答
1

A good solution is to add a hook. Something like that should be works.

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')

You can add it in your main.py or appengine_config.py. By this way the hook is configured during the loading of the instances and keeps his state.

于 2012-07-09T09:29:27.223 回答
1

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

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

于 2012-07-09T09:34:58.443 回答