如何在Google App Engine(Python)中定义配置变量/常量?

时间:2010-08-26 19:46:57

标签: python google-app-engine config

我是python / GAE的新手,我想知道如何快速定义和使用全局设置变量,所以说你git克隆我的GAE应用程序而你只需打开config.yaml,添加更改设置和应用程序全部都是连线的,如下:

# config.yaml (or whatever)
settings:
  name: "Lance"
  domain: "http://example.com"

# main.py
class Main(webapp.RequestHandler):
  def get(self):
    logging.info(settings.name) #=> "Lance"

做这样的事情的基本方法是什么(我来自Ruby)?

2 个答案:

答案 0 :(得分:12)

您可以使用任何Python持久性模块,但不限于YAML。

示例:ConfigParser,PyYAML,一个像ElementTree这样的XML解析器,一个像Django中使用的设置模块......

# ---------- settings.py

NAME = "Lance"
DOMAIN = "http://example.com"

# ---------- main.py

import settings

settings.DOMAIN # [...]

# ---------- settings.ini

[basic]
name = Lance
domain = http://example.com

# ---------- main.py

import ConfigParser

parser = ConfigParser.ConfigParser()
parser.read('setting.ini')

try:
    name = get('basic', 'name')
except (NoOptionError, NoSectionError):
    # no settings

答案 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

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

DOMAIN = Settings.get('DOMAIN')

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

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