如何在Google App Engine(Python)中定义配置变量/常量?
我刚开始接触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