config.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. """DMS环境配置。"""
  2. from __future__ import annotations
  3. import os
  4. from pathlib import Path
  5. from typing import Any
  6. BACKEND_ROOT = Path(__file__).resolve().parents[1]
  7. DEFAULT_STORAGE_ROOT = BACKEND_ROOT / "dms-storage"
  8. DEFAULT_UI_DICTIONARY_CONFIG_PATH = (
  9. BACKEND_ROOT / "dms" / "resources" / "ui-dictionaries.zh-CN.json"
  10. )
  11. DEFAULT_DATABASE_URL = (
  12. "mysql+pymysql://dms_app:change-me@127.0.0.1:3306/dms?charset=utf8mb4"
  13. )
  14. def _positive_int(name: str, default: int) -> int:
  15. raw_value = os.environ.get(name)
  16. if raw_value is None or not raw_value.strip():
  17. return default
  18. try:
  19. value = int(raw_value)
  20. except ValueError as exc:
  21. raise ValueError(f"{name}必须是正整数") from exc
  22. if value <= 0:
  23. raise ValueError(f"{name}必须是正整数")
  24. return value
  25. def load_dms_config() -> dict[str, Any]:
  26. """从环境变量加载DMS配置,不读取或覆盖现有AI配置。"""
  27. storage_value = os.environ.get("DMS_STORAGE_ROOT", "").strip()
  28. storage_root = Path(storage_value or DEFAULT_STORAGE_ROOT).expanduser()
  29. max_upload_size = _positive_int(
  30. "DMS_MAX_UPLOAD_SIZE", 100 * 1024 * 1024
  31. )
  32. max_file_size = _positive_int(
  33. "DMS_MAX_FILE_SIZE", min(50 * 1024 * 1024, max_upload_size)
  34. )
  35. if max_file_size > max_upload_size:
  36. raise ValueError("DMS_MAX_FILE_SIZE不得超过DMS_MAX_UPLOAD_SIZE")
  37. database_url = os.environ.get("DMS_DATABASE_URL", "").strip()
  38. ui_dictionary_config_value = os.environ.get(
  39. "DMS_UI_DICTIONARY_CONFIG_PATH", ""
  40. ).strip()
  41. ui_dictionary_config_path = Path(
  42. ui_dictionary_config_value or DEFAULT_UI_DICTIONARY_CONFIG_PATH
  43. ).expanduser()
  44. return {
  45. "SQLALCHEMY_DATABASE_URI": database_url or DEFAULT_DATABASE_URL,
  46. "SQLALCHEMY_TRACK_MODIFICATIONS": False,
  47. "SQLALCHEMY_ENGINE_OPTIONS": {
  48. "isolation_level": "READ COMMITTED",
  49. "pool_pre_ping": True,
  50. "pool_recycle": 1800,
  51. "connect_args": {
  52. "init_command": "SET time_zone = '+00:00'",
  53. },
  54. },
  55. "DMS_STORAGE_ROOT": str(storage_root.resolve()),
  56. "DMS_MAX_UPLOAD_SIZE": max_upload_size,
  57. "DMS_MAX_FILE_SIZE": max_file_size,
  58. "MAX_CONTENT_LENGTH": max_upload_size,
  59. "DMS_BATCH_MAX_FILES": _positive_int("DMS_BATCH_MAX_FILES", 50),
  60. "DMS_BUSINESS_TIMEZONE": (
  61. os.environ.get("DMS_BUSINESS_TIMEZONE", "").strip()
  62. or "Asia/Shanghai"
  63. ),
  64. "DMS_JWT_SECRET": os.environ.get("DMS_JWT_SECRET", ""),
  65. "DMS_JWT_ISSUER": "dms",
  66. "DMS_JWT_EXPIRES_SECONDS": 7200,
  67. "DMS_JWT_KEEP_SIGNED_IN_EXPIRES_SECONDS": 604800,
  68. "DMS_UI_DICTIONARY_CONFIG_PATH": str(
  69. ui_dictionary_config_path.resolve()
  70. ),
  71. }