pythonbeginner

Type-Safe Settings with Pydantic

Load and validate environment variables into a typed settings object using pydantic-settings with defaults.

python
from pydantic_settings import BaseSettings
from pydantic import Field, field_validator


class Settings(BaseSettings):
    # Database
    database_url: str = Field(..., description="PostgreSQL connection string")
    db_pool_size: int = Field(default=5, ge=1, le=50)

    # Redis
    redis_url: str = Field(default="redis://localhost:6379")

    # App
    debug: bool = Field(default=False)
    secret_key: str = Field(..., min_length=32)
    allowed_origins: list[str] = Field(default=["http://localhost:3000"])

    # API
    api_rate_limit: int = Field(default=100)
    api_version: str = Field(default="v1")

    model_config = {
        "env_file": ".env",
        "env_file_encoding": "utf-8",
        "case_sensitive": False,
    }

    @field_validator("allowed_origins", mode="before")
    @classmethod
    def parse_origins(cls, v):
        if isinstance(v, str):
            return [s.strip() for s in v.split(",")]
        return v


# Singleton pattern
_settings: Settings | None = None

def get_settings() -> Settings:
    global _settings
    if _settings is None:
        _settings = Settings()
    return _settings


# Usage:
# settings = get_settings()
# print(settings.database_url)
# print(settings.debug)

Sponsored

Doppler — Secret management platform

Use Cases

  • Application configuration
  • 12-factor app settings
  • Multi-environment configs

Tags

Related Snippets

Similar patterns you can reuse in the same workflow.