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