Pydantic Settings Environment Variables

Load typed configuration from environment variables with pydantic-settings, layering dotenv files and validating on import.

PythonConfig Management

Code

snippet
from functools import lru_cache

from pydantic import Field, PostgresDsn, ValidationError
from pydantic_settings import BaseSettings, SettingsConfigDict


class AppSettings(BaseSettings):
    model_config = SettingsConfigDict(
        env_file=('.env.defaults', '.env'),
        env_file_encoding='utf-8',
        env_prefix='APP_',
        extra='ignore',
        case_sensitive=False,
    )

    environment: str = Field(default='development', pattern='^(dev|staging|prod)$')
    debug: bool = False
    database_dsn: PostgresDsn
    pool_size: int = Field(default=10, ge=1, le=100)
    log_level: str = Field(default='info', pattern='^(debug|info|warning|error)$')


@lru_cache
def get_settings() -> AppSettings:
    try:
        return AppSettings()
    except ValidationError as exc:
        errors = '; '.join(
            f"{'.'.join(str(p) for p in e['loc'])}: {e['msg']}"
            for e in exc.errors()
        )
        raise SystemExit(f'invalid configuration -> {errors}') from exc


settings = get_settings()
print('running in', settings.environment, 'pool', settings.pool_size)