Skip to content

設定管理(pydantic-settings)

認証 のページでは security.pySECRET_KEY を直書きして、「本番では環境変数から読み込む」ってコメントしてた。
ここでは .env ファイルと pydantic-settings を使って、設定値を型安全に読み込む方法を。

例として、こんな .env ファイルがあるとする。

# .env
ALICE_NAME="Alice"
ALICE_EMAIL="alice@example.com"
ALICE_AGE=30


.env から値を読む(load_dotenv)

一番単純なやり方は python-dotenvload_dotenv を使うこと。まずはインストールしてから。

uv add python-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 の値が読める。

Alice
alice@example.com
30

型チェックがされない

os.getenv で取れる値は全部文字列。なので alice_age30 という整数ではなく "30" という文字列になる。
例えば alice_age を使って数値の条件分岐をする処理があるとして、 .envALICE_AGE=30.1 ってミスしてても、その場では気づけない。ミスに気づくのは、その処理を通るエンドポイントにリクエストが来たとき……もっと早く気づきたい。


pydantic-settings で型とデフォルト値を付ける

pydantic-settings を使うと、設定値に型とデフォルト値を指定できる。まずはインストールしてから。

uv add 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_AGEint になる)。デフォルト値( Bob / 45 )は .env に値があれば上書きされる。

Alice
alice@example.com
30

ここで .envALICE_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".envSettings で定義していない余分なキーがあっても無視する。 Pydantic v1 の BaseSettings との互換性のために推奨されてる。

cf. https://docs.pydantic.dev/latest/api/pydantic_settings/

Tip

認証SECRET_KEY も同じように設定できる。 SettingsSECRET_KEY: str を定義して .env から読み込めば、直書きしなくて済むし、設定を忘れたとしても起動時にすぐ気づける。
使い方は Full Stack FastAPI Template の config.py が参考になる。
.env は秘密情報を含むので .gitignore に書いておくべき (コミットしない) 。