1. 程式人生 > >Python廖雪峰實戰web開發(Day6-編寫配置檔案)

Python廖雪峰實戰web開發(Day6-編寫配置檔案)

通常,一個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類的屬性,從而可以使用類的屬性查詢資訊的方法,這裡考慮到功能可能不是很大,就不作程式碼了。