config.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. """应用配置:从 .env / 环境变量加载。
  2. 通过 APP_ENV 切换不同环境的配置文件:
  3. APP_ENV=dev → 加载 .env.dev(开发环境)
  4. APP_ENV=prod → 加载 .env(生产环境,默认)
  5. 启动示例:
  6. APP_ENV=dev uvicorn app.main:app --reload # 开发
  7. APP_ENV=prod uvicorn app.main:app --workers 3 # 生产
  8. uvicorn app.main:app --workers 3 # 默认 prod
  9. """
  10. import os
  11. from pydantic_settings import BaseSettings, SettingsConfigDict
  12. def _resolve_env_file() -> str:
  13. """根据 APP_ENV 选择对应的 env 文件。"""
  14. env = os.getenv("APP_ENV", "prod").lower()
  15. return ".env.dev" if env == "dev" else ".env"
  16. class Settings(BaseSettings):
  17. """所有可配置项;不允许在源码中硬编码凭据。"""
  18. model_config = SettingsConfigDict(
  19. env_file=_resolve_env_file(),
  20. env_file_encoding="utf-8",
  21. case_sensitive=False,
  22. extra="ignore",
  23. )
  24. # 当前运行环境("dev" 或 "prod"),从环境变量 APP_ENV 注入
  25. app_env: str = "prod"
  26. # Zendesk 凭据
  27. zendesk_subdomain: str
  28. zendesk_email: str
  29. zendesk_api_token: str
  30. # 业务默认值
  31. default_locale: str = "en-us"
  32. # 缓存刷新时间(本地时区,24 小时制)
  33. cache_refresh_hour: int = 0
  34. cache_refresh_minute: int = 0
  35. # HTTP
  36. http_timeout: int = 30
  37. # Redis(多 worker 共享缓存与 leader 选举)
  38. redis_url: str = "redis://127.0.0.1:6379/0"
  39. redis_password: str | None = None
  40. redis_username: str | None = None
  41. redis_key_prefix: str = "faq_search"
  42. # leader 锁 TTL(秒);心跳每 leader_lock_ttl/3 续期一次
  43. leader_lock_ttl: int = 60
  44. # follower 等待 leader 首次写入缓存的最大秒数
  45. cache_ready_wait: int = 180
  46. # API 文档(Swagger / ReDoc)访问凭据 — 统一开启,需 HTTP Basic 认证
  47. docs_username: str = "admin"
  48. docs_password: str = "asj@123456"
  49. @property
  50. def zendesk_base_url(self) -> str:
  51. return f"https://{self.zendesk_subdomain}.zendesk.com/api/v2/help_center"
  52. @property
  53. def zendesk_auth(self) -> tuple[str, str]:
  54. # Zendesk API Token 鉴权格式:("{email}/token", api_token)
  55. return (f"{self.zendesk_email}/token", self.zendesk_api_token)
  56. settings = Settings()