100 lines
3.4 KiB
Python
100 lines
3.4 KiB
Python
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()
|