初始化
This commit is contained in:
0
core/config/__init__.py
Normal file
0
core/config/__init__.py
Normal file
179
core/config/settings.py
Normal file
179
core/config/settings.py
Normal file
@@ -0,0 +1,179 @@
|
||||
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"]
|
||||
Reference in New Issue
Block a user