frontend error management enhancement
This commit is contained in:
107
app/core/environment.py
Normal file
107
app/core/environment.py
Normal file
@@ -0,0 +1,107 @@
|
||||
# app/core/environment.py
|
||||
"""
|
||||
Environment detection utilities.
|
||||
|
||||
Automatically detects environment based on runtime conditions
|
||||
rather than relying on configuration.
|
||||
"""
|
||||
|
||||
import os
|
||||
from typing import Literal
|
||||
|
||||
EnvironmentType = Literal["development", "staging", "production"]
|
||||
|
||||
|
||||
def get_environment() -> EnvironmentType:
|
||||
"""
|
||||
Detect current environment automatically.
|
||||
|
||||
Detection logic:
|
||||
1. Check ENV environment variable if set
|
||||
2. Check ENVIRONMENT environment variable if set
|
||||
3. Auto-detect based on hostname/indicators:
|
||||
- localhost, 127.0.0.1 → development
|
||||
- Contains 'staging' → staging
|
||||
- Otherwise → production (safe default)
|
||||
|
||||
Returns:
|
||||
str: 'development', 'staging', or 'production'
|
||||
"""
|
||||
# Priority 1: Explicit ENV variable
|
||||
env = os.getenv("ENV", "").lower()
|
||||
if env in ["development", "dev", "local"]:
|
||||
return "development"
|
||||
elif env in ["staging", "stage"]:
|
||||
return "staging"
|
||||
elif env in ["production", "prod"]:
|
||||
return "production"
|
||||
|
||||
# Priority 2: ENVIRONMENT variable
|
||||
env = os.getenv("ENVIRONMENT", "").lower()
|
||||
if env in ["development", "dev", "local"]:
|
||||
return "development"
|
||||
elif env in ["staging", "stage"]:
|
||||
return "staging"
|
||||
elif env in ["production", "prod"]:
|
||||
return "production"
|
||||
|
||||
# Priority 3: Auto-detect from common indicators
|
||||
|
||||
# Check if running in debug mode (common in development)
|
||||
if os.getenv("DEBUG", "").lower() in ["true", "1", "yes"]:
|
||||
return "development"
|
||||
|
||||
# Check common development indicators
|
||||
hostname = os.getenv("HOSTNAME", "").lower()
|
||||
if any(dev_indicator in hostname for dev_indicator in ["local", "dev", "laptop", "desktop"]):
|
||||
return "development"
|
||||
|
||||
# Check for staging indicators
|
||||
if "staging" in hostname or "stage" in hostname:
|
||||
return "staging"
|
||||
|
||||
# Default to development for safety (HTTPS not required in dev)
|
||||
# Change this to "production" if you prefer secure-by-default
|
||||
return "development"
|
||||
|
||||
|
||||
def is_development() -> bool:
|
||||
"""Check if running in development environment."""
|
||||
return get_environment() == "development"
|
||||
|
||||
|
||||
def is_staging() -> bool:
|
||||
"""Check if running in staging environment."""
|
||||
return get_environment() == "staging"
|
||||
|
||||
|
||||
def is_production() -> bool:
|
||||
"""Check if running in production environment."""
|
||||
return get_environment() == "production"
|
||||
|
||||
|
||||
def should_use_secure_cookies() -> bool:
|
||||
"""
|
||||
Determine if cookies should have secure flag (HTTPS only).
|
||||
|
||||
Returns:
|
||||
bool: True if production or staging, False if development
|
||||
"""
|
||||
return not is_development()
|
||||
|
||||
|
||||
# Cache the environment detection result
|
||||
_cached_environment: EnvironmentType | None = None
|
||||
|
||||
|
||||
def get_cached_environment() -> EnvironmentType:
|
||||
"""
|
||||
Get environment with caching.
|
||||
|
||||
Environment is detected once and cached for performance.
|
||||
Useful if you call this frequently.
|
||||
"""
|
||||
global _cached_environment
|
||||
if _cached_environment is None:
|
||||
_cached_environment = get_environment()
|
||||
return _cached_environment
|
||||
Reference in New Issue
Block a user