設定管理是一個看似簡單的問題,直到你需要處理多個環境、數百個設定以及靈活性與安全性之間的持續拉鋸。Dynaconf(GitHub 上的 dynaconf/dynaconf)是一個 Python 設定管理函式庫,它以最少的樣板程式碼,提供一個在開發、測試和正式環境中都能運作的統一系統,直接應對了這項挑戰。
由 Bruno Rocha 建立,並由專門的社群維護,Dynaconf 已成長為最受歡迎的 Python 設定函式庫之一,在 GitHub 上擁有超過 3,500 顆星。其設計理念很直接:設定應該是階層式的、型別安全的、感知環境的,並且能夠從多個後端載入,而不需要修改應用程式碼。
該函式庫支援 YAML、TOML、INI、JSON 和 Python 檔案,以及環境變數、Redis、HashiCorp Vault 和 AWS SSM Parameter Store。這種廣泛的支援意味著,單一的 Dynaconf 設定可以處理從本地開發環境的 TOML 檔案,到從 Vault 提取機密、從 Redis 提取功能旗標的正式環境設定,全部透過一致的 Python API。
設定層架構
Dynaconf 的強大來自其分層設定系統,設定從最通用到最具體層層遞進:
graph TD
A[預設設定\nsettings.toml] --> B[環境層\n.env 檔案]
B --> C[機密層\n.secrets.toml]
C --> D[環境變數\nENV_PREFIX]
D --> E[外部來源\nVault / Redis / AWS SSM]
E --> F[執行時期覆寫\nDynaconf API]
F --> G[最終解析\n設定]
G --> H[應用程式\n取用]每個層級都可以覆寫前一個層級,Dynaconf 在整個過程中保持完整的型別資訊。這意味著預設設定中的字串值可以被環境變數中的布林值覆寫,並由 Dynaconf 的驗證系統自動進行型別轉換。
格式與後端支援
| 設定來源 | 格式 / 後端 | 典型使用案例 |
|---|---|---|
| 設定檔 | YAML, TOML, JSON, INI, Python | 版本控制的預設值 |
| 環境檔案 | .env 檔案 | 本機覆寫 |
| 機密檔案 | .secrets.toml | 版本控制系統外的敏感資料 |
| 環境變數 | ENV_PREFIX_* | 容器 / CI 設定 |
| 外部密碼庫 | HashiCorp Vault | 正式環境機密 |
| 鍵值儲存 | Redis | 動態功能旗標 |
| 參數儲存 | AWS SSM | 雲端原生部署 |
驗證與型別安全
Dynaconf 最突出的功能之一是其驗證系統,可以在設定錯誤導致執行時期故障之前就將其捕獲。驗證器可以強制型別、檢查數值範圍、要求特定鍵,甚至驗證跨欄位依賴關係(例如,確保如果設定了 DATABASE_URL,那麼 DATABASE_PORT 也必須定義)。
from dynaconf import Dynaconf, Validator
settings = Dynaconf(
settings_files=["settings.toml"],
validators=[
Validator("VERSION", must_exist=True),
Validator("DATABASE.HOST", must_exist=True),
Validator("DATABASE.PORT", must_exist=True, ne=0),
Validator("DEBUG", must_exist=True, is_type_of=bool),
]
)
這種主動驗證方法消除了整類與設定相關的錯誤,這些錯誤通常只有在載入特定環境或執行特定程式碼路徑時才會出現。在正式環境中,這可能意味著乾淨的部署回滾和半夜的事件回應之間的差別。
推薦的外部資源
- Dynaconf GitHub 儲存庫 – 原始碼、問題和文件
- Dynaconf 官方文件 – 設定、驗證和密碼庫整合的完整指南
常見問題
什麼是 Dynaconf? Dynaconf 是一個 Python 設定管理函式庫,支援多種檔案格式(YAML、TOML、INI、JSON、Python)、環境變數、密碼庫後端和具有環境特定覆寫功能的階層式設定。它專為處理任何規模的應用程式在開發、測試和正式環境中的設定而設計。
Dynaconf 如何處理環境特定設定? Dynaconf 使用基於環境的分層系統,設定可以全域定義,然後每個環境(開發、測試、正式)單獨覆寫。它會自動從 ENV_FOR_DYNACONF 等變數讀取當前環境,並載入適當的設定層,後面的層級會覆寫前面的層級。
Dynaconf 支援哪些檔案格式? Dynaconf 支援 YAML、TOML、INI、JSON、Python 檔案和環境變數。它還能從外部來源載入設定,包括 Redis、HashiCorp Vault、AWS SSM Parameter Store 和資料庫後端,使其幾乎能適應任何基礎設施設定。
Dynaconf 與 Python 內建的 configparser 相比如何? Python 的 configparser 只能處理基本的 INI 檔案,而 Dynaconf 提供了型別轉換、驗證、階層式合併、金鑰管理、環境變數型別轉換,以及對 YAML 和 TOML 等現代格式的支援。Dynaconf 還能與 Flask 和 Django 整合,實現無縫的網頁應用程式設定。
Dynaconf 能處理機密和敏感資料嗎? 是的,Dynaconf 包含內建的機密管理支援,可與 HashiCorp Vault 整合、環境變數混淆處理和 .secrets 檔案。它可以從加密來源載入敏感設定,同時將其他設定保留在版本控制下的純文字檔案中。
延伸閱讀
- Dynaconf 在 GitHub 上 – 包含原始碼和範例的儲存庫
- Dynaconf 官方文件 – 完整的設定管理指南
無程式碼也能輕鬆打造專業LINE官方帳號!一鍵導入模板,讓AI助你行銷加分!