# 配置管理 - 集中管理所有环境变量和敏感配置 import os from functools import lru_cache from typing import Optional class Settings: """应用配置类""" def __init__(self): # 阿里云百炼AI (DASHSCOPE) API Key - 必须设置,无默认值 self.DASHSCOPE_API_KEY: Optional[str] = os.getenv("DASHSCOPE_API_KEY") # 阿里云短信服务配置 - 必须设置,无默认值 self.SMS_ACCESS_KEY_ID: Optional[str] = os.getenv("SMS_ACCESS_KEY_ID") self.SMS_ACCESS_KEY_SECRET: Optional[str] = os.getenv("SMS_ACCESS_KEY_SECRET") self.SMS_SIGN_NAME: str = os.getenv("SMS_SIGN_NAME", "甲辰藏品") self.SMS_TEMPLATE_CODE: str = os.getenv("SMS_TEMPLATE_CODE", "SMS_xxx") # 数据库配置 - 必须设置,无默认值 self.DATABASE_URL: Optional[str] = os.getenv("DATABASE_URL") # JWT配置 self.SECRET_KEY: str = os.getenv("SECRET_KEY") # 必须设置,无默认值 self.ALGORITHM: str = os.getenv("ALGORITHM", "HS256") self.ACCESS_TOKEN_EXPIRE_MINUTES: int = int(os.getenv("ACCESS_TOKEN_EXPIRE_MINUTES", "10080")) # 7天 # OSS配置 - 必须设置,无默认值 self.OSS_ACCESS_KEY_ID: Optional[str] = os.getenv("OSS_ACCESS_KEY_ID") self.OSS_ACCESS_KEY_SECRET: Optional[str] = os.getenv("OSS_ACCESS_KEY_SECRET") self.OSS_BUCKET: str = os.getenv("OSS_BUCKET", "jiachenlong-oss") self.OSS_ENDPOINT: str = os.getenv("OSS_ENDPOINT", "oss-cn-hangzhou.aliyuncs.com") # Redis配置 (可选,用于限流和缓存) self.REDIS_URL: Optional[str] = os.getenv("REDIS_URL") # API Rate Limiting self.RATE_LIMIT_ENABLED: bool = os.getenv("RATE_LIMIT_ENABLED", "true").lower() == "true" self.RATE_LIMIT_SMS_PER_MINUTE: int = int(os.getenv("RATE_LIMIT_SMS_PER_MINUTE", "3")) self.RATE_LIMIT_OCR_PER_MINUTE: int = int(os.getenv("RATE_LIMIT_OCR_PER_MINUTE", "10")) self.RATE_LIMIT_BATCH_PER_MINUTE: int = int(os.getenv("RATE_LIMIT_BATCH_PER_MINUTE", "5")) self.RATE_LIMIT_API_PER_MINUTE: int = int(os.getenv("RATE_LIMIT_API_PER_MINUTE", "60")) # 管理员账号 - 必须设置,无默认值 self.ADMIN_USERNAME: Optional[str] = os.getenv("ADMIN_USERNAME") self.ADMIN_PASSWORD: Optional[str] = os.getenv("ADMIN_PASSWORD") def get_dashscope_api_key(self) -> str: """获取阿里云百炼API Key""" if not self.DASHSCOPE_API_KEY: raise ValueError("DASHSCOPE_API_KEY 环境变量未设置") return self.DASHSCOPE_API_KEY def get_sms_config(self) -> dict: """获取短信配置""" return { "access_key_id": self.SMS_ACCESS_KEY_ID, "access_key_secret": self.SMS_ACCESS_KEY_SECRET, "sign_name": self.SMS_SIGN_NAME, "template_code": self.SMS_TEMPLATE_CODE, } @lru_cache() def get_settings() -> Settings: """获取单例配置实例""" return Settings() # 导出便捷访问 settings = get_settings()