Files
lotteryServer/core/config/settings.py
2026-09-03 14:31:25 +08:00

179 lines
4.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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"]