from typing import List from pydantic import Field from pydantic_settings import BaseSettings, SettingsConfigDict from enum import Enum class Environment(str, Enum): """环境枚举""" LOCAL = "local" DEVELOPMENT = "dev" STAGING = "staging" PRODUCTION = "prod" class LogLevel(str, Enum): """日志级别枚举""" DEBUG = "DEBUG" INFO = "INFO" WARNING = "WARNING" ERROR = "ERROR" CRITICAL = "CRITICAL" class Settings(BaseSettings): """ 应用配置类 自动从 .env 文件和环境变量中读取配置 """ # ---------- 基础配置 ---------- APP_NAME: str = Field( default="Lottery Server", description="应用名称" ) APP_DESCRIPTION: str = Field( default="一个自己看的彩票信息服务", description="应用描述" ) ENVIRONMENT: Environment = Field( default=Environment.LOCAL, description="运行环境" ) # ---------- 服务器配置 ---------- HOST: str = Field( default="0.0.0.0", description="服务监听地址" ) PORT: int = Field( default=8000, ge=1, le=65535, description="服务监听端口" ) # ---------- 数据库MYSQL配置 ---------- MYSQL_USER: str = Field( default='root', description="MySQL用户名" ) MYSQL_PASSWORD: str = Field( default='Azure1314', description="MySQL密码" ) MYSQL_HOST: str = Field( default='127.0.0.1', description="MySQL主机地址" ) MYSQL_PORT: int = Field( default=3306, ge=1, le=65535, description="MySQL端口" ) MYSQL_DB: str = Field( default='lottery_server', description="MySQL数据库名" ) DATABASE_POOL_SIZE: int = Field( default=10, ge=1, le=100, description="数据库连接池大小" ) DATABASE_MAX_OVERFLOW: int = Field( default=20, description="连接池最大溢出连接数" ) DATABASE_ECHO: bool = Field( default=False, description="是否打印SQL语句" ) # ---------- CORS配置 ---------- ALLOWED_ORIGINS: List[str] = Field( default=["*"], description="允许的CORS源" ) ALLOWED_METHODS: List[str] = Field( default=["GET", "POST", "PUT", "DELETE", "OPTIONS"], description="允许的HTTP方法" ) ALLOWED_HEADERS: List[str] = Field( default=["*"], description="允许的HTTP头" ) # ---------- 限流配置 ---------- RATE_LIMIT_PER_MINUTE: int = Field( default=60, ge=1, description="每分钟请求限制" ) RATE_LIMIT_PER_DAY: int = Field( default=10000, ge=1, description="每天请求限制" ) # ---------- 文件上传配置 ---------- MAX_UPLOAD_SIZE_MB: int = Field( default=10, ge=1, le=100, description="最大上传文件大小(MB)" ) ALLOWED_UPLOAD_EXTENSIONS: List[str] = Field( default=[".jpg", ".jpeg", ".png", ".pdf", ".docx"], description="允许上传的文件扩展名" ) UPLOAD_DIR: str = Field( default="./uploads", description="文件上传目录" ) # ---------- 缓存配置 ---------- CACHE_TTL_SECONDS: int = Field( default=300, ge=1, description="缓存过期时间(秒)" ) # ---------- 计算属性 ---------- @property def mysql_url(self) -> str: """MySQL连接URL""" # 连接url格式:mysql+pymysql://user:password@host:port/dbname return f"mysql+pymysql://{self.MYSQL_USER}:{self.MYSQL_PASSWORD}@{self.MYSQL_HOST}:{self.MYSQL_PORT}/{self.MYSQL_DB}?charset=utf8mb4" @property def is_production(self) -> bool: """是否为生产环境""" return self.ENVIRONMENT == Environment.PRODUCTION @property def is_development(self) -> bool: """是否为开发环境""" return self.ENVIRONMENT in [Environment.LOCAL, Environment.DEVELOPMENT] # ---------- 配置加载设置 ---------- model_config = SettingsConfigDict( env_file=".env.local", # .env文件路径 env_file_encoding="utf-8", # 文件编码 case_sensitive=True, # 环境变量名大小写敏感 extra="ignore", # 忽略未定义的额外字段 validate_default=True, # 验证默认值 # secrets_dir="/run/secrets", # Docker secrets支持(可选) ) # 创建全局单例配置实例 settings = Settings() # 导出配置实例 __all__ = ["settings", "Environment", "LogLevel"]