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

6 投票
2 回答
2136 浏览
提问于 2025-04-16 03:21

我刚开始接触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 个回答

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

如果数据存储中有这个键对应的值,你就能拿到它。如果没有,系统会创建一个占位记录,并抛出一个异常。这个异常会提醒你去开发者控制台更新这个占位记录。

我发现这样可以避免在设置配置值时的猜测。如果你不确定该设置什么配置值,只需运行代码,它会告诉你!

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

撰写回答