我是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)?
答案 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')
如果数据存储区中存在该键的值,您将获得该值。如果没有,将创建占位符记录并抛出异常。该异常将提醒您转到开发人员控制台并更新占位符记录。
我发现这可以避免设置配置值。如果您不确定要设置的配置值,只需运行代码即可告诉您!