一个网站应用运行时都需要读取配置文件,一般包括数据库的用户名、口令等。默认的配置文件应该符合本地开发环境,我们把默认的配置文件命名为config_default.py:
<code> configs = {'debug'
:True
,'db'
: {'host'
:'127.0.0.1'
,'port'
:3306
,'user'
:'root'
,'password'
:'password'
,'db'
:'woodman'
},'session'
: {'secret'
:'woodman'
} }/<code>
当将网站部署到服务器时,通常需要修改数据库的host等信息,直接修改config_default.py不是一个好办法,更好的方法是编写一个config_override.py,用来覆盖某些默认设置:
<code> configs = {'db'
: {'host'
:'127.0.0.1'
} }/<code>
应用程序读取配置文件需要优先从config_override.py读取。为了简化读取配置文件,可以把所有配置读取到统一的config.py中, 然后将之转化为可读的字典:
<code>import
config_defaultclass
Dict
(dict)
:''' Simple dict but support access as x.y style. '''
def
__init__
(self, names=
()
, values=()
, **kw): super(Dict, self).__init__(**kw)for
k, vin
zip(names, values): self[k] = vdef
__getattr__
(self, key)
:try
:return
self[key]except
KeyError:raise
AttributeError(r"'Dict' object has no attribute '%s'"
% key)def
__setattr__
(self, key, value)
: self[key] = valuedef
merge
(defaults, override)
: r = {}for
k, vin
defaults.items():if
kin
override:if
isinstance(v, dict): r[k] = merge(v, override[k])else
: r[k] = override[k]else
: r[k] = vreturn
rdef
toDict
(d)
: D = Dict()for
k, vin
d.items(): D[k] = toDict(v)if
isinstance(v, dict)else
vreturn
D configs = config_default.configstry
:import
config_override configs = merge(configs, config_override.configs)except
ImportError:pass
configs = toDict(configs)/<code>
注意:本地测试时不需要编写创建config_override.py