Python廖雪峰實戰web開發(Day6-編寫配置檔案)
阿新 • • 發佈:2019-01-26
通常,一個Web App執行的時候都要讀取配置檔案,比如資料庫的名字,口令等,在不同的環境中執行,可以讀取不同的配置檔案。
由於Python本身語法簡單,完全可以用原始碼來實現配置。
預設的配置檔案應該完全符合本地開發環境,這樣,無需任何設定,就可以立刻啟動伺服器。
建立預設的配置檔案config_default.py
:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = 'Seiei'
'''
編寫預設配置檔案
'''
configs = {
'db':{
'host':'127.0.0.1' ,
'port':3306,
'user':'www-data',
'password':'www-data',
'database':'awsome'
},
'session':{
'secret':'awesome'
}
}
建立覆蓋配置檔案config_override.py
:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = 'Seiei'
'''
編寫覆蓋配置檔案
'''
configs = {
'db' :{
'user':'Seiei'
}
}
建立合併檔案,即最後資料庫呼叫的檔案config.py
:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__author__ = 'Seiei'
'''
編寫最新配置檔案
'''
from web_app import config_default
#建立一個以覆蓋配置檔案為準,從而更新預設配置並返回的函式
def merge(defaults,override):#收集引數
r = {}
for name,value in defaults.items():
if name in override: #覆蓋檔案有此引數
if isinstance(value,dict): #判斷是否其value為dict
r[name] = merge(value,override[name]) #是的話,則建立新的字典後,呼叫原函式(遞迴)
else:
r[name] = override[name] #否則把覆蓋配置檔案的值匯入
else:
r[name] = defaults[name] #如果覆蓋檔案沒有,就繼續使用預設值
return r
config = config_default.configs
try:
from web_app import config_override
merge(config,config_override.configs)
print(merge(config,config_override.configs))
except ImportError:
pass
另外,此處廖老師還引入getattr
了繫結dict
類的屬性,從而可以使用類的屬性查詢資訊的方法,這裡考慮到功能可能不是很大,就不作程式碼了。