通常,一个Web App在运行时都需要读取配置文件,比如数据库的
用户名、
口令等,在不同的环境中运行时,Web App可以通过读取不同的配置文件来获得正确的配置。
默认的配置文件应该完全符合本地开发环境,这样,无需任何设置,就可以立刻启动服务器。
创建一个默认配置文件
config_default.py:
configs = {
'db':{
'host': 'localhost',
'port': 3306,
'user': 'root',
'password': 'password',
'db': 'awesome'
},
'session':{
'secret': 'AwEsOmE'
}
}
上述配置文件简单明了。但是,如果要部署到服务器时,通常需要修改数据库的host等信息,直接修改
config_default.py不是一个好办法,更好的方法是编写一个
config_override.py,用来覆盖某些默认设置:
configs = {
'db':{
'host': '192.168.0.100'
}
}
最后,编写一个
config.py,用来整合所有配置文件:
import config_default
class Dict(dict):
def __init__(self, names = (), values = (), **kw):
super().__init__(**kw)
for k, v in zip(names, values):
self[k] = v
def __getattr__(self, key):
try:
return self[key]
except KeyError:
raise AttributeError(r"'Dict' object has no attribute like '%s'" % key)
def __setattr__(self, key, value):
self[key] = value
def merge(defaults, override):
r = {}
for k, v in defaults.items():
if k in override:
if isinstance(v, dict):
r[k] = merge(v, override[k]) # 若v是dict,继续迭代
else:
r[k] = override[k] # 否则,用新值覆盖默认值
else:
r[k] = v # 覆盖参数未定义时,仍使用默认参数
return r
def toDict(configs):
D = Dict()
for k, v in configs.items():
D[k] = toDict(v) if isinstance(v, dict) else v
return D
configs = config_default.configs
try:
import config_override
configs = merge(configs, config_override.configs) # 获得组合后的configs,dict
except ImportError:
pass
configs = toDict(configs) # 将configs组合成Dict类的实例,可以通过configs.k直接获取v
其中的
Dict类和
toDict函数,能让configs对象获取value可以像调用实例属性一样操作。
即获取value:
configs[key] 等价
configs.key