1

我将 Google App Engine 与 webapp2 框架 (Python) 一起使用。

几乎对我的应用程序的每个请求都需要考虑一些很少更改的设置。我当前的实现有一个类

class Settings(ndb.Model):
    # a few ndb.KeyProperty and ndb.BooleanProperty types

每个请求处理程序使用一个函数

def get_settings():
    s = Settings.get_by_id('settings')
    if not s:
        s = Settings(id='settings')
        s.put()
    return s

检索 ID 为“设置”的单个实体。NDB自动将这个实体存储在memcache中,所以功能还是挺快的,不过今天发现了webapp2的registry属性。

  1. get_settings在注册表中写入设置实体并尝试从那里检索它,仅使用 NDB/memcache 作为后备是一个好主意吗?

  2. 这就是注册表的用途吗?该文档只有一个延迟导入的示例。

4

2 回答 2

4

快速查看源代码: http ://webapp-improved.appspot.com/_modules/webapp2.html#WSGIApplication

注册表是 WSGIApplication 对象本地的字典。您将在每个正在运行的 GAE 实例上获得一个单独的 WSGIApplication 对象。因此,如果后续的 HTTP 请求命中不同的实例,它们将获得不同的 WSGIApplication 对象,从而获得不同的注册中心。它也不会在 memcache 中的多个实例之间共享。

注册表很好地替换了全局变量。在 App Engine 中使用全局变量有点危险,因为值不会在实例之间共享。一个常见的用途是缓存需要时间初始化的数据或对象。例如,如果您使用了大量的正则表达式,您可以在第一次使用它们时编译它们,并将它们保存在注册表中,这样您就不需要在以后的请求中重新编译它们。

在存储设置方面,这可能是一个坏主意。只要您在更改设置时都可以重置每个实例(以及该实例的注册表),就可以做到这一点。

于 2013-10-08T15:15:36.067 回答
0
  1. 我已经使用注册表有一段时间了,不记得我遇到的任何问题。所以是的,如果你愿意,你可以使用它。

根据您想要跟踪的数据,您还可以选择使用 webapp2 Sessions库。使用会话的一个优点是您可以从 cookie 中写入和读取,因此您可以在内存缓存中保存一些写入和读取(Google 会向您收费)。

  1. 我不确定开发人员在编写它时的想法,我想现在没有办法找到。
于 2015-11-22T14:20:27.710 回答