| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- import os
- from dataclasses import dataclass
- from pathlib import Path
- def _database_file_values() -> dict[str, str]:
- """Read the project's existing database note without copying credentials."""
- path = Path(__file__).resolve().parents[2] / "数据库.md"
- if not path.exists():
- return {}
- values: dict[str, str] = {}
- for line in path.read_text(encoding="utf-8").splitlines():
- if ":" in line:
- key, value = line.split(":", 1)
- elif "=" in line:
- key, value = line.split("=", 1)
- else:
- continue
- values[key.strip().lower()] = value.strip()
- return values
- _database_values = _database_file_values()
- @dataclass(frozen=True)
- class Settings:
- # Keep credentials outside the source tree. DEMO_MODE defaults to "never":
- # a database failure raises an error instead of silently serving demo data.
- # Use DEMO_MODE=always for demo data, or DEMO_MODE=auto for fallback.
- db_host: str = os.getenv("DB_HOST", _database_values.get("host", "127.0.0.1"))
- db_port: int = int(os.getenv("DB_PORT", _database_values.get("port", "3306")))
- db_user: str = os.getenv("DB_USER", _database_values.get("user", "root"))
- db_password: str = os.getenv("DB_PASSWORD", _database_values.get("password", ""))
- db_name: str = os.getenv("DB_NAME", _database_values.get("db_name", "compressorsensor"))
- db_connect_timeout: int = int(os.getenv("DB_CONNECT_TIMEOUT", "3"))
- demo_mode: str = os.getenv("DEMO_MODE", "never").strip().lower()
- cors_origin: str = os.getenv("CORS_ORIGIN", "http://localhost:5173")
- annotation_width: int = int(os.getenv("ANNOTATION_WIDTH", "10"))
- auth_user: str = os.getenv("AUTH_USER", "aaabbb")
- auth_password: str = os.getenv("AUTH_PASSWORD", "Aa*147258&cd")
- auth_token_ttl_seconds: int = int(os.getenv("AUTH_TOKEN_TTL_SECONDS", "43200"))
- settings = Settings()
|