编写配置文件
一个网站应用运行时都需要读取配置文件,一般包括数据库的用户名、口令等。默认的配置文件应该符合本地开发环境,我们把默认的配置文件命名为config_default.py
:
# config_default.py configs = { 'debug': True, 'db': { 'host': '127.0.0.1', 'port': 3306, 'user': 'www-data', 'password': 'www-data', 'db': 'awesome' }, 'session': { 'secret': 'Awesome' } }
当将网站部署到服务器时,通常需要修改数据库的host等信息,直接修改config_default.py
不是一个好办法,更好的方法是编写一个config_override.py
,用来覆盖某些默认设置:
# config_override.py configs = { 'db': { 'host': '127.0.0.1' } }
应用程序读取配置文件需要优先从config_override.py
读取。为了简化读取配置文件,可以把所有配置读取到统一的config.py
中, 然后将之转化为可读的字典:
import config_default class Dict(dict): ''' Simple dict but support access as x.y style. ''' def __init__(self, names=(), values=(), **kw): super(Dict, self).__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 '%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]) else: r[k] = override[k] else: r[k] = v return r def toDict(d): D = Dict() for k, v in d.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) except ImportError: pass configs = toDict(configs)
注意:本地测试时不需要编写创建config_override.py