1. 程式人生 > 其它 >Python實戰網站開發:Day6-編寫配置檔案

Python實戰網站開發:Day6-編寫配置檔案

  編寫配置檔案

  一個網站應用執行時都需要讀取配置檔案,一般包括資料庫的使用者名稱、口令等。預設的配置檔案應該符合本地開發環境,我們把預設的配置檔案命名為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