2010-08-26 103 views
4

我是全新的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)?

回答

10

您可以使用任何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 
+0

+1正是我在找的:) – 2011-04-01 19:54:34

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

如果对于一个值键入数据存储区中,您将获得它。如果没有,则会创建占位符记录并引发异常。该例外会提醒您转到Developers Console并更新占位符记录。

我发现这需要猜测出设置配置值。如果您不确定要设置什么配置值,只需运行代码,它会告诉您!

相关问题