什么是在Google AppEngine(python)中存储配置的好地方

时间:2010-09-23 10:22:03

标签: python google-app-engine configuration-files

我正在制作一个Google AppEngine应用程序,我怀疑是否应该存储(敏感)配置数据,如凭据。

我应该为配置制作一个bigtable实体,还是有另一种建议的存储方式。

3 个答案:

答案 0 :(得分:18)

如果您可以将它们嵌入到源代码中,那么您可以这样做,但如果您需要它可以动态配置,那么数据存储就是您的选择。您可以通过在本地内存中缓存它们来避免在每个请求上获取设置。这是一个辅助类:

class Configuration(db.Model):
  _INSTANCE = None

  @classmethod
  def get_instance(cls):
    if not cls._INSTANCE:
      cls._INSTANCE = cls.get_or_insert('config')
    return cls._INSTANCE

只需使用您需要的任何配置值(或修改类本身)将其子类化。由于加载的代码在请求之间保持不变,因此您只需要为每个应用程序实例执行一次提取 - 但如果您希望能够动态更新配置,则可能需要构建超时。

如果您想在有限的时间内缓存内容,最好的选择就是在获取时间时存储时间戳:

class Configuration(db.Model):
  CACHE_TIME = datetime.timedelta(minutes=5)

  _INSTANCE = None
  _INSTANCE_AGE = None

  @classmethod
  def get_instance(cls):
    now = datetime.datetime.now()
    if not cls._INSTANCE or cls._INSTANCE_AGE + cls.CACHE_TIME < now:
      cls._INSTANCE = cls.get_or_insert('config')
      cls._INSTANCE_AGE = now
    return cls._INSTANCE

答案 1 :(得分:10)

将它们存储在模块中。你可以简单一点,比如拥有config.py模块,比如说:

AMAZON_KEY = 'XXXX'

然后使用:

import config
service = my_amazon_service(config.AMAZON_KEY)

或者有一个稍微复杂的配置对象,允许您为应用程序,命名空间配置键等提供合理的默认值。

答案 2 :(得分:4)

如果是敏感数据,则不应将其存储在源代码中,因为它会被检入源代码管理中。错误的人(组织内部或外部)可能会在那里找到它。此外,您的开发环境可能使用生产环境中的不同配置值。如果这些值存储在代码中,则必须在开发和生产中运行不同的代码,这是一种混乱和不良的做法。

在我的项目中,我使用此类将配置数据放在数据存储区中:

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

您的应用程序会执行此操作以获取值:

AMAZON_KEY = Settings.get('AMAZON_KEY')

如果数据存储区中存在该键的值,您将获得该值。如果没有,将创建占位符记录并抛出异常。该异常将提醒您转到开发人员控制台并更新占位符记录。

我发现这可以避免设置配置值。如果您不确定要设置的配置值,只需运行代码即可告诉您!