分享

Python实战

 flyk0tcfb46p9f 2020-04-18

一个网站应用运行时都需要读取配置文件,一般包括数据库的用户名、口令等。默认的配置文件应该符合本地开发环境,我们把默认的配置文件命名为config_default.py:

# config_default.py
configs = {    'debug': True,    'db': {        'host': '127.0.0.1',        'port': 3306,        'user': 'root',        'password': 'password',        'db': 'woodman'
   },    'session': {        'secret': 'woodman'
   }
}

当将网站部署到服务器时,通常需要修改数据库的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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多