iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0

簡介

在前一篇關於日誌記錄(Logging)的討論中,介紹了 Logger 的等級系統。開發者可以根據實際需求靈活調整日誌的等級。例如,在測試過程中,開發者可以將 Logger 等級設置為 Debug,以便深入檢查變數的當前狀態。而在應用正式部署、面向用戶時,則可以將等級提高至 Info,過濾掉不必要的詳細信息,專注於重要事件。

在上述情境中,如果開發者能夠將設定檔與程式碼分離,程式碼只專注於邏輯和功能,這將帶來極大的靈活性。當需要修改配置時,開發者只需調整設定檔,而無需直接更改程式碼。這不僅降低了出錯的風險,還提升了程式的可讀性和維護性,使得開發過程更加高效和可靠。

此外,設定參數中通常包含大量機密資訊。例如,當 Web Application 需要連線至硬碟中的資料庫時,必須提供帳號和密碼來完成連線。將這些敏感資料直接寫入程式碼中會大幅增加意外洩露的風險。因此,將這些機密資訊隔離至設定檔並進行加密處理,是更為妥當的做法。這能妥善保護機密資料,顯著提升系統的安全性。

Python 有許多管理設定檔的套件工具。在之前的篇章中,我們曾介紹過 Pydantic,它是一個資料驗證的套件。本篇將介紹一個基於 Pydantic 的設定檔管理套件——pydantic-settings。這個套件擁有以下幾個特色:

  1. 型別安全
    pydantic-settings 繼承了 Pydantic 的強大數據驗證功能,設定參數會在加載時自動驗證類型,確保配置符合預期的數據結構。這樣可以避免使用錯誤的數據類型導致程式錯誤

  2. 多種配置來源支持
    支持從多種來源讀取設定,如環境變數、.envJSONYAML 文件等。這讓它在應用程式的開發和部署過程中非常靈活

  3. 優先級處理
    當同一個設定存在於多個來源時,它有明確的優先順序,例如環境變數通常優先於配置文件中的值。這樣允許根據需求靈活覆蓋某些配置,而不必改動原始設定檔。

接下來,我將透過範例來進行介紹。

範例

本次範例使用的是 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 事件將會隱藏。
https://ithelp.ithome.com.tw/upload/images/20240925/20168663vmx0WMXNYf.png


上一篇
[Day 11] Logging
下一篇
[Day 13] ZoneInfo
系列文
Python 不止於數據,開發應用程式它也在行!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言