Python-dotenv 環境變數管理
在開發實務專案(尤其是後端、API 或爬蟲)時,我們經常需要處理一些敏感資訊,例如資料庫密碼、API 金鑰(API Key)或是第三方服務的憑證。絕對不要將這些資訊直接寫死 (Hardcode) 在程式碼中。
常見的做法是將這些設定存在「環境變數」中。Python-dotenv 是一個輕量級工具,它能讓你將這些設定寫在一個名為 .env 的檔案裡,並在程式啟動時自動載入,讓你的程式碼既安全又具備高度的可配置性。
為什麼要使用 .env 檔案?
- 安全性:敏感資料與代碼分離。只要將
.env加入.gitignore,機密就不會洩漏到 GitHub 等版本控制平台。 - 靈活性:輕鬆在不同的環境(開發環境、測試環境、預發行環境、正式環境)之間切換配置,而不需要修改任何一行程式碼。
- 遵循標準:這是 12-Factor App 原則中「將配置存於環境中」的最佳實踐。
安裝
pip install python-dotenv
基礎工作流程
步驟 1:建立 .env 檔案
在專案的根目錄建立一個名為 .env 的檔案(注意開頭有一個點),並以 KEY=VALUE 的格式撰寫:
# 資料庫連線設定
DB_HOST=localhost
DB_PORT=5432
DB_USER=admin
DB_PASS=very_secret_password
# 第三方 API 金鑰
OPENAI_API_KEY=sk-xxxx...
STRIPE_SECRET=sk_test_...
# 開發標記
DEBUG=True
步驟 2:在 Python 中載入與讀取
使用 load_dotenv() 函式將 .env 中的變數載入到系統環境變數中,隨後透過 Python 內建的 os 模組讀取。
import os
from dotenv import load_dotenv
# 1. 啟動時立即載入 (會尋找當前目錄下的 .env)
load_dotenv()
# 2. 像讀取系統環境變數一樣讀取它們
db_host = os.getenv("DB_HOST")
debug_mode = os.getenv("DEBUG") == "True" # 注意:讀出來的值永遠是字串
# 3. 提供預設值 (若環境變數中找不到該項目)
api_endpoint = os.getenv("API_URL", "https://api.default.com")
print(f"資料庫連結位置: {db_host}")
進階應用技巧
1. 變數擴充 (Variable Expansion)
你可以引用檔案中已定義的變數,減少重複輸入。
BASE_URL=https://api.myapp.com
AUTH_URL=${BASE_URL}/v1/auth
DATA_URL=${BASE_URL}/v1/data
2. 指定特定的 .env 路徑
如果你的檔案不在啟動腳本所在的目錄,或者你想根據環境載入不同的檔案:
from pathlib import Path
from dotenv import load_dotenv
env_path = Path('.') / 'configs' / '.env.production'
load_dotenv(dotenv_path=env_path, override=True)
# override=True 代表若系統變數已存在同名項目,以 .env 檔案為準
3. 搭配 Pydantic 使用 (專業推薦)
如果你正在開發 FastAPI 或是較具規模的服務,強烈建議整合 Pydantic Settings。它能提供「型別驗證」與「自動分選」。
# 安裝: pip install pydantic-settings
from pydantic_settings import BaseSettings, SettingsConfigDict
class GlobalConfig(BaseSettings):
# 自動將環境變數轉為對應型別
db_port: int = 5432
db_host: str
openai_api_key: str
# 設定讀取的路徑
model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8')
settings = GlobalConfig()
print(settings.db_port) # 輸出為 int 型別
重要的安全實踐
1. 永遠不要 commit 你的
.env 檔案!
請確保你的 .gitignore 中包含 .env、.env.local 等機密檔案。2. 提供 .env.example
為了讓協作者知道專案需要哪些設定,你應該 commit 一個範本檔。
.env.example 內容:
DB_HOST=
DB_USER=
DB_PASS=
總結
- 機密資料隔離是開發者的基本素養。
- 專案入口點的第一行通常就是
load_dotenv()。 - 透過
os.getenv獲取配置,或透過Pydantic進行強型別管理。 - 養成建立
.env.example的好習慣,方便團隊開發與部署測試。