在请求之间存储 GAE 应用设置:使用 webapp2 注册表



我将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的注册表属性。

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

  2. 这就是注册表的用途吗?该文档仅包含延迟导入的示例。

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

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

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

在存储设置方面,这可能是一个坏主意。 只要您可以在更改设置时重置每个实例(以及具有该实例的注册表(,就可以完成此操作。

  1. 我已经使用注册表一段时间了,不记得我遇到的任何问题。所以是的,如果你愿意,你可以使用它。

根据要跟踪的数据,您还可以选择使用 webapp2 会话库。使用会话的一个优点是,你可以从cookie中写入和读取,这样你就可以在memcache中保存一些写入和读取(谷歌向你收费(。

  1. 我不确定开发人员在编写它时的想法是什么,我想现在没有办法找到。

最新更新