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