179 lines
4.6 KiB
Python
179 lines
4.6 KiB
Python
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"] |