如何在Google App Engine(Python)中定义配置变量/常量?
问题描述:
我是全新的python/GAE,想知道如何快速定义和使用全局设置变量,所以说你git克隆我的GAE应用程序,你只需打开config.yaml
,添加更改设置,并且应用程序全部连线,像这样:如何在Google App Engine(Python)中定义配置变量/常量?
# 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)?
答
您可以使用任何Python持久性模块,您不限于YAML。
例子:ConfigParser,PyYAML,XML解析器像ElementTree中,设置模块像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
答
如果是敏感数据,你不应该将它存储在源代码,因为它将被检入源代码控制。错误的人(在你的组织内部或外部)可能会在那里找到它。另外,您的开发环境可能会使用生产环境中的不同配置值。如果这些值存储在代码中,那么您将不得不在开发和生产中运行不同的代码,这是一种混乱和糟糕的做法。
在我的项目,我把配置数据在数据存储中使用这个类:
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')
如果对于一个值键入数据存储区中,您将获得它。如果没有,则会创建占位符记录并引发异常。该例外会提醒您转到Developers Console并更新占位符记录。
我发现这需要猜测出设置配置值。如果您不确定要设置什么配置值,只需运行代码,它会告诉您!
+1正是我在找的:) – 2011-04-01 19:54:34