| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- """应用配置:从 .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
- @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()
|