config.py 1.9 KB

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