import os import logging from functools import lru_cache from typing import Optional from pydantic import BaseModel from dotenv import load_dotenv, find_dotenv # 配置日志 logging.basicConfig(level=logging.INFO) logger = logging.getLogger("config") # 尝试加载环境变量 logger.info("开始加载环境变量...") load_dotenv() class Settings(BaseModel): """应用程序配置类""" # DashScope配置 dashscope_api_key: str = os.getenv("DASHSCOPE_API_KEY", "") # 服务器配置 host: str = os.getenv("HOST", "0.0.0.0") port: int = int(os.getenv("PORT", "9001")) debug: bool = os.getenv("DEBUG", "False").lower() in ["true", "1", "t", "yes"] # 腾讯云配置 qcloud_secret_id: str = os.getenv("QCLOUD_SECRET_ID", "") qcloud_secret_key: str = os.getenv("QCLOUD_SECRET_KEY", "") qcloud_cos_region: str = os.getenv("QCLOUD_COS_REGION", "ap-chengdu") qcloud_cos_bucket: str = os.getenv("QCLOUD_COS_BUCKET", "") qcloud_cos_domain: str = os.getenv("QCLOUD_COS_DOMAIN", "") # 数据库配置 db_host: str = os.getenv("DB_HOST", "localhost") db_port: int = int(os.getenv("DB_PORT", "3306")) db_user: str = os.getenv("DB_USER", "root") db_password: str = os.getenv("DB_PASSWORD", "") db_name: str = os.getenv("DB_NAME", "aidress") # 数据库URL @property def database_url(self) -> str: """ 构建SQLAlchemy数据库连接URL Returns: str: 数据库连接URL """ return f"mysql+pymysql://{self.db_user}:{self.db_password}@{self.db_host}:{self.db_port}/{self.db_name}" # 其他配置可以根据需要添加 log_level: str = os.getenv("LOG_LEVEL", "INFO") @lru_cache() def get_settings() -> Settings: """ 获取应用程序配置 使用lru_cache装饰器避免重复读取环境变量,提高性能 Returns: Settings: 配置对象 """ settings = Settings() logger.info(f"配置已加载:DB_HOST={settings.db_host}, DB_NAME={settings.db_name}") return settings def validate_api_key(): """ 验证API密钥是否已配置 Raises: ValueError: 如果API密钥未配置 """ settings = get_settings() if not settings.dashscope_api_key: raise ValueError("DASHSCOPE_API_KEY未设置,请在.env文件中配置") return True def validate_qcloud_config(): """ 验证腾讯云配置是否已设置 Raises: ValueError: 如果腾讯云配置未正确设置 """ settings = get_settings() if not settings.qcloud_secret_id or not settings.qcloud_secret_key: raise ValueError("腾讯云SecretId和SecretKey未设置,请在.env文件中配置") if not settings.qcloud_cos_bucket: raise ValueError("腾讯云COS存储桶名称未设置,请在.env文件中配置") return True