How to validate Python application configuration, separate secrets, fail safely at startup and keep environments reproducible without scattered getenv calls.
Load configuration once, validate it before serving traffic, separate secret delivery from ordinary settings and make unsafe combinations impossible.
def send_email(message):
api_key = os.getenv("API_KEY", "dev-key")
timeout = int(os.getenv("TIMEOUT", "0"))
debug = os.getenv("DEBUG", "true")
requests.post(URL, json=message, timeout=timeout)class Settings(BaseSettings):
environment: Literal["development", "staging", "production"]
email_api_key: SecretStr
email_timeout_seconds: Annotated[float, Field(gt=0, le=30)]
debug: bool = False
settings = Settings() # validated once during startup
email = EmailGateway(settings.email_api_key, settings.email_timeout_seconds)Create one configuration boundary
Scattered getenv calls hide required values, parsing rules and defaults across the codebase. Load environment input into one typed settings object during startup and inject the relevant subset into each component.
Production should fail before accepting traffic when a required value is missing or contradictory. Silent defaults such as a development credential or zero timeout turn configuration mistakes into runtime incidents.
Treat secrets differently
Secrets need controlled storage, delivery, rotation and redaction. They should not appear in source control, container layers, client bundles, exception messages or configuration dumps.
Pass secret values only to the adapter that uses them. Where providers support overlapping credentials, rotate without downtime by accepting the new credential before revoking the old one.
Keep environments comparable
Environment-specific behaviour should come from explicit capability or endpoint differences, not large branches that make staging and production execute different code paths.
Record a safe configuration fingerprint—versions and enabled features, never secret values—with each release. This helps diagnose drift while keeping deployment configuration reviewable.
Evidence to take into review
- All required configuration is typed and validated at startup.
- Production has no unsafe development defaults.
- Secrets never appear in logs, images or public bundles.
- Components receive only the configuration they need.
- Credential rotation and configuration rollback are documented.
Explore all engineering notes.
Use PRODUCTION-7 to connect this concern with the other dimensions of a trustworthy backend.
View all articles Get the checklist