設定管理(pydantic-settings)¶
認証 のページでは security.py に SECRET_KEY を直書きして、「本番では環境変数から読み込む」ってコメントしてた。
ここでは .env ファイルと pydantic-settings を使って、設定値を型安全に読み込む方法を。
- 公式ドキュメント: https://docs.pydantic.dev/latest/concepts/pydantic_settings/#dotenv-env-support
- フルスタックテンプレートでの使用例: https://github.com/fastapi/full-stack-fastapi-template/blob/master/backend/app/core/config.py
例として、こんな .env ファイルがあるとする。
.env から値を読む(load_dotenv)¶
一番単純なやり方は python-dotenv の load_dotenv を使うこと。まずはインストールしてから。
# load_dotenv を使う場合
import os
from dotenv import load_dotenv
load_dotenv()
alice_name = os.getenv("ALICE_NAME")
alice_email = os.getenv("ALICE_EMAIL")
alice_age = os.getenv("ALICE_AGE")
print(alice_name)
print(alice_email)
print(alice_age)
実行すると .env の値が読める。
型チェックがされない
os.getenv で取れる値は全部文字列。なので alice_age も 30 という整数ではなく "30" という文字列になる。
例えば alice_age を使って数値の条件分岐をする処理があるとして、 .env を ALICE_AGE=30.1 ってミスしてても、その場では気づけない。ミスに気づくのは、その処理を通るエンドポイントにリクエストが来たとき……もっと早く気づきたい。
pydantic-settings で型とデフォルト値を付ける¶
pydantic-settings を使うと、設定値に型とデフォルト値を指定できる。まずはインストールしてから。
# pydantic-settings を使う場合
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
model_config = SettingsConfigDict(
env_file=".env",
env_ignore_empty=True,
extra="ignore",
)
ALICE_NAME: str = "Bob"
ALICE_EMAIL: str = "Bob@example.com"
ALICE_AGE: int = 45
settings = Settings()
print(settings.ALICE_NAME)
print(settings.ALICE_EMAIL)
print(settings.ALICE_AGE)
.env の値が、クラスで指定した型で読み込まれる( ALICE_AGE は int になる)。デフォルト値( Bob / 45 )は .env に値があれば上書きされる。
ここで .env を ALICE_AGE=30.1 ってミスしてたら、 FastAPI(uvicorn) を起動しようとしたときにエラーになるので、すぐ気づける。
Traceback (most recent call last):
...
pydantic_core._pydantic_core.ValidationError: 1 validation error for Settings
ALICE_AGE
Input should be a valid integer, unable to parse string as an integer [type=int_parsing, input_value='30.1', input_type=str]
For further information visit https://errors.pydantic.dev/2.13/v/int_parsing
model_config のオプション
env_file=".env"… 読み込む.envファイルのパス。env_ignore_empty=True… 値が空(例:ALICE_NAME=)のときはデフォルト値を使う。False(デフォルト)だと空文字""がそのまま入る(Noneではない)ので注意。extra="ignore"….envにSettingsで定義していない余分なキーがあっても無視する。 Pydantic v1 のBaseSettingsとの互換性のために推奨されてる。
Tip
認証 の SECRET_KEY も同じように設定できる。 Settings に SECRET_KEY: str を定義して .env から読み込めば、直書きしなくて済むし、設定を忘れたとしても起動時にすぐ気づける。
使い方は Full Stack FastAPI Template の config.py が参考になる。
.env は秘密情報を含むので .gitignore に書いておくべき (コミットしない) 。