Pydantic Settings Environment Variables
Load typed configuration from environment variables with pydantic-settings, layering dotenv files and validating on import.
Code
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)Report a problem with this exampleOpens a pre-filled issue on GitHub.