在Google App Engine上存储应用程序设置

5

我需要为我的Google App Engine项目存储设置。目前我有:

class Settings(db.Model):
    rate = db.IntegerProperty(default=4)
    ...

当我想要使用它时:

Settings.get_or_insert('settings')

这种方式感觉很笨拙,有没有更好的方法(不使用Django)?

应用程序的版本部署之间的设置会发生变化吗? - Adam Crossland
是的,在部署期间也可以进行更新。 - hoju
2个回答

4
请说明你对此的“感觉笨拙”是指什么——我不太清楚。
数据存储是在App Engine中持久化可更新数据的方法(blobstore用于大型二进制数据,memcache不保证持久性)。如果应用程序无法更改设置,当然可以将它们放入自己的自定义yaml文件中(或其他文件,但yaml是App Engine自己配置文件的存储方式...;-);只需记住所有这些文件从应用程序的角度来看都是只读的。YAML方便地提供给App Engine应用程序解析其自己的.yaml(但是“只读”)文件。

这让我感到笨拙,因为我正在强制模型只有一个实例。 - hoju
@Adam,我完全同意 - memcache不能保证会一直存在,但如果它恰好存在,它会更快;-)。@Richard,问题是,数据存储是你唯一拥有的(用于持久性保证存储)。如果您有许多不同的“碎片”需要持久化,可以使用无定形模型来存储其中任何一个(作为pickled blob),但这并不一定更优雅。 - Alex Martelli
Memcache是多余的。你只有一个设置对象 - 把它存储在模块级别或类级别变量中。没有什么比本地内存访问更快了。 - Nick Johnson
@Alex 鉴于启动请求相对较少,与常规请求相比,使用memcaching以及本地存储并不能带来太多好处。然而,我的主要观点是,Adam的评论建议将配置信息进行memcaching,但对于每个请求都需要的小型数据,将其存储在本地实例上速度会更快。 - Nick Johnson
@Nick,我明白了,谢谢——确实,进程启动相对请求的频率是关键,我想它可以在任何给定的应用程序中通过经验测量来衡量(这取决于其使用是否“时间聚集”)。当然,你肯定不希望将其缓存在内存中而不是重复使用内存中的副本——但是对于多个同时运行的进程,如果其中任何一个更改了配置,则最好有一种简单的方法使所有其他进程“使他们的缓存无效”(如果这些更改非常频繁,则在每次更改时存储[[MC&DS]]并在每次请求时重新加载[[MC if there, else DS]]可能是最好的选择!)。 - Alex Martelli
显示剩余3条评论

0
在我的项目中,我使用这个类将配置数据(每个配置值一个记录)放入数据存储中:
from google.appengine.ext import ndb

class Settings(ndb.Model):
  name = ndb.StringProperty()
  value = ndb.StringProperty()

  @staticmethod
  def get(name):
    NOT_SET_VALUE = "NOT SET"
    retval = Settings.query(Settings.name == name).get()
    if not retval:
      retval = Settings()
      retval.name = name
      retval.value = NOT_SET_VALUE
      retval.put()
    if retval.value == NOT_SET_VALUE:
      raise Exception(('Setting %s not found in the database. A placeholder ' +
        'record has been created. Go to the Developers Console for your app ' +
        'in App Engine, look up the Settings record with name=%s and enter ' +
        'its value in that record\'s value field.') % (name, name))
    return retval.value

您的应用程序可以通过以下方式获取一个值:

API_KEY = Settings.get('API_KEY')

如果数据存储中存在该键的值,则会返回该值。如果不存在,则会创建一个占位记录并抛出异常。异常将提醒您前往开发人员控制台并更新占位记录。

我发现这样可以消除设置配置值时的猜测。如果您不确定要设置哪些配置值,只需运行代码,它就会告诉您!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接