Python和YAML-GAE应用程序设置文件

时间:2014-01-27 22:32:04

标签: python google-app-engine yaml

我正在阅读使用YAML在GAE应用程序中存储设置,我想我想这样做。我说的是我自己的常量,如API键和临时变量,而不是像app.yaml这样的标准GAE配置文件。

到目前为止,我使用了一个简单的settings.py文件(其中包括用于生产/测试/ etc环境的单独配置),但它似乎不能很好地完成这项工作。

当git merge覆盖了一些设置(很难控制它)时,我甚至遇到了一些严重的问题。

最终我想在数据存储中存储尽可能多的数据但是现在我正在寻找想法。

对于简单存储和访问(有时是受保护的)配置数据的人来说,是否有任何想法或示例?

2 个答案:

答案 0 :(得分:2)

将API密钥和配置变量存储在静态文件中通常总是一个坏主意,原因如下:

  • 难以更新:您需要部署新应用才能更新值
  • 不安全:您可能会将其提交给版本控制系统并且无法返回
  • 不扩展:您经常使用不同域的不同密钥

那么为什么不从一开始就安全地将所有这些值存储在数据存储区中,特别是当它实际上非常容易时,以下是:

您所要做的就是为配置值创建一个新模型,并且只有一个记录。通过使用NDB,您可以开箱即用,并且由于此配置文件的性质,您甚至可以按运行实例缓存它,以避免定期读取数据存储。

class Config(ndb.Model):
  analytics_id = ndb.StringProperty(default='')
  brand_name = ndb.StringProperty(default='my-awesome-app')
  facebook_app_id = ndb.StringProperty(default='')
  facebook_app_secret = ndb.StringProperty(default='')

  @classmethod
  def get_master_db(cls):
    return cls.get_or_insert('master')

我也猜测你已经有一个很可能被称为config.py的文件,你有一些像这样的常量:

PRODUCTION = os.environ.get('SERVER_SOFTWARE', '').startswith('Google App Engine')
DEVELOPMENT = not PRODUCTION

如果您没有创建一个,或者只是将其添加到该文件中:

import model   # Your module that contains the models

CONFIG_DB = model.Config.get_master_db()

最后能够读取您的配置值,您只需在应用中的任何地方(当然导入config.py之后)执行此操作:

config.CONFIG_DB.brand_name

从现在开始,您甚至不必创建任何特殊表单来更新这些值(但建议使用),因为您可以从本地管理控制台或生产中的仪表板执行此操作。

请记住,如果您要将该记录存储在本地变量中,则必须在更新值后重新启动instances以查看更改。


以上所有内容都可以在我的一个名为gae-init的开源项目中看到它。

答案 1 :(得分:1)

由于其他答案中列出的原因,您不应将配置值存储在源代码中。在我的最新项目中,我使用此类将配置数据放在数据存储区中:

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

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

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