from pydantic_settings import BaseSettings from typing import Optional, Dict, Any, List import os import logging # 创建一个基本的配置日志记录器 config_logger = logging.getLogger("config") if not config_logger.handlers: handler = logging.StreamHandler() handler.setFormatter(logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s' )) config_logger.addHandler(handler) config_logger.setLevel(logging.INFO) class Settings(BaseSettings): PROJECT_NAME: str = "ExamService" VERSION: str = "1.0.0" API_V1_STR: str = "/api/v1" MYSQL_USER: str = "mooc" MYSQL_PASSWORD: str = "CzHkA6JFCL5hznhP" MYSQL_HOST: str = "localhost" MYSQL_PORT: str = "3306" MYSQL_DATABASE: str = "mooc" SQLALCHEMY_DATABASE_URI: Optional[str] = None SQLALCHEMY_ECHO: bool = False SECRET_KEY: str = "your-secret-key-here" ALGORITHM: str = "HS256" ACCESS_TOKEN_EXPIRE_MINUTES: int = 30 WECHAT_APPID: str = "" WECHAT_APPSECRET: str = "" WECHAT_UNIACID: int = 1 # 日志配置 LOG_DIR: str = "logs" LOG_NAME: str = "exam_service" LOG_LEVEL: int = logging.DEBUG LOG_MAX_SIZE: int = 10 * 1024 * 1024 # 10MB LOG_BACKUP_COUNT: int = 5 ENVIRONMENT: str = "development" # development, testing, production BASE_URL: str = "http://127.0.0.1:2333" UPLOAD_IMG_DIR: str = "upload/images" ATTACH_URL: str = "/attachment/" # 用于构建返回的文件URL def __init__(self, **kwargs): super().__init__(**kwargs) # 设置数据库URI self.SQLALCHEMY_DATABASE_URI = ( f"mysql+pymysql://{self.MYSQL_USER}:{self.MYSQL_PASSWORD}" f"@{self.MYSQL_HOST}:{self.MYSQL_PORT}/{self.MYSQL_DATABASE}" ) # 确保上传目录为绝对路径并存在 self._setup_upload_directory() def _setup_upload_directory(self): """确保上传目录为绝对路径且存在""" # 首先记录初始值,便于诊断 config_logger.info(f"初始上传目录配置: {self.UPLOAD_IMG_DIR}") # 确保没有前导斜杠,避免被误判为绝对路径 if self.UPLOAD_IMG_DIR.startswith('/'): self.UPLOAD_IMG_DIR = self.UPLOAD_IMG_DIR[1:] config_logger.info(f"移除前导斜杠: {self.UPLOAD_IMG_DIR}") # 规范化路径分隔符 self.UPLOAD_IMG_DIR = os.path.normpath(self.UPLOAD_IMG_DIR) # 现在正确判断并处理绝对路径 if not os.path.isabs(self.UPLOAD_IMG_DIR): # 获取当前工作目录的绝对路径 current_dir = os.path.abspath(os.getcwd()) config_logger.info(f"当前工作目录: {current_dir}") # 安全地拼接路径 self.UPLOAD_IMG_DIR = os.path.join(current_dir, self.UPLOAD_IMG_DIR) config_logger.info(f"转换上传目录为绝对路径: {self.UPLOAD_IMG_DIR}") # 确保目录存在 if not os.path.exists(self.UPLOAD_IMG_DIR): os.makedirs(self.UPLOAD_IMG_DIR, exist_ok=True) config_logger.info(f"创建上传目录: {self.UPLOAD_IMG_DIR}") else: config_logger.info(f"上传目录已存在: {self.UPLOAD_IMG_DIR}") # 记录最终的上传目录路径 config_logger.info(f"上传文件将保存到: {self.UPLOAD_IMG_DIR}") class Config: env_file = ".env" settings = Settings()