在前一篇關於日誌記錄(Logging)的討論中,介紹了 Logger 的等級系統。開發者可以根據實際需求靈活調整日誌的等級。例如,在測試過程中,開發者可以將 Logger 等級設置為 Debug
,以便深入檢查變數的當前狀態。而在應用正式部署、面向用戶時,則可以將等級提高至 Info
,過濾掉不必要的詳細信息,專注於重要事件。
在上述情境中,如果開發者能夠將設定檔與程式碼分離,程式碼只專注於邏輯和功能,這將帶來極大的靈活性。當需要修改配置時,開發者只需調整設定檔,而無需直接更改程式碼。這不僅降低了出錯的風險,還提升了程式的可讀性和維護性,使得開發過程更加高效和可靠。
此外,設定參數中通常包含大量機密資訊。例如,當 Web Application 需要連線至硬碟中的資料庫時,必須提供帳號和密碼來完成連線。將這些敏感資料直接寫入程式碼中會大幅增加意外洩露的風險。因此,將這些機密資訊隔離至設定檔並進行加密處理,是更為妥當的做法。這能妥善保護機密資料,顯著提升系統的安全性。
Python 有許多管理設定檔的套件工具。在之前的篇章中,我們曾介紹過 Pydantic,它是一個資料驗證的套件。本篇將介紹一個基於 Pydantic 的設定檔管理套件——pydantic-settings。這個套件擁有以下幾個特色:
型別安全
pydantic-settings 繼承了 Pydantic 的強大數據驗證功能,設定參數會在加載時自動驗證類型,確保配置符合預期的數據結構。這樣可以避免使用錯誤的數據類型導致程式錯誤
多種配置來源支持
支持從多種來源讀取設定,如環境變數、.env
、JSON
、YAML
文件等。這讓它在應用程式的開發和部署過程中非常靈活
優先級處理
當同一個設定存在於多個來源時,它有明確的優先順序,例如環境變數通常優先於配置文件中的值。這樣允許根據需求靈活覆蓋某些配置,而不必改動原始設定檔。
接下來,我將透過範例來進行介紹。
本次範例使用的是 Pydantic Settings 2.5.2 版本
poetry add pydantic-settings==2.5.2
接續前篇有關 Logging 的範例,開發者首先需要修改原本的 index.py
文件。在這裡,我們將使用 basicConfig
來配置 Logging,其 Handler 和 Formatter 均使用預設設定,而等級為 Debug
,開發者可以直接在終端機中查看輸出結果。
import logging
from flask import Flask
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger('simple_example')
app = Flask(__name__)
@app.route('/')
def index():
logger.debug('Get index page from new request')
return 'Index Page'
接著,開發者建立了 settings.py
,並定義設定檔的名稱 .env
,接著定義了一個名為 debug 的設定,其類型為 bool,預設值為 False。如果開發者未提供 debug 參數,則將使用預設值 False。
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8')
debug: bool = False
最後,開發者需要修改原本的 index.py
,以透過設定檔來控制是否過濾 Debug
等級的事件。
#####
from settings import Settings
settings = Settings()
logging.basicConfig(level=logging.DEBUG if settings.debug else logging.INFO)
#####
請記得在目錄中新增 .env
檔案,並宣告 Debug
參數。由於設定檔預設是大小寫不敏感的,因此開發者可以根據團隊的習慣和規範來決定參數的格式。
DEBUG=True
開發者可以執行指令 poetry run flask --app index run
,並在網頁瀏覽器中輸入 http://127.0.0.1:5000
,這樣就能在終端機中看到 Debug
事件。反之,如果開發者將設定調整為 DEBUG=False
,則 Debug
事件將會隱藏。