2025-12-04 10:04:21 +08:00

78 lines
2.4 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.

# app/core/settings/app.py
import logging
import sys
from typing import Any, Dict, List, Tuple, Optional
from loguru import logger
from pydantic import PostgresDsn, SecretStr, EmailStr
from app.core.logging import InterceptHandler
from app.core.settings.base import BaseAppSettings
class AppSettings(BaseAppSettings):
# ===== 基本 FastAPI 设置 =====
debug: bool = False
docs_url: str = "/docs"
openapi_prefix: str = ""
openapi_url: str = "/openapi.json"
redoc_url: str = "/redoc"
title: str = "FastAPI example application"
version: str = "0.0.0"
# ===== 数据库 =====
database_url: PostgresDsn
max_connection_count: int = 10
min_connection_count: int = 10
# ===== 安全/JWT =====
secret_key: SecretStr
api_prefix: str = "/api"
jwt_token_prefix: str = "Token"
# ===== CORS/Host =====
allowed_hosts: List[str] = ["*"]
# ===== 日志 =====
logging_level: int = logging.INFO
loggers: Tuple[str, str] = ("uvicorn.asgi", "uvicorn.access")
# ===== 邮件/验证码(新增配置) =====
mail_from: EmailStr = "no-reply@example.com"
# SMTP 基础(兼容 Py3.9:使用 Optional[...]
smtp_host: str = "localhost"
smtp_port: int = 25
smtp_user: Optional[SecretStr] = None
smtp_password: Optional[SecretStr] = None
smtp_tls: bool = False # True 时将尝试 STARTTLS
# 验证码配置
email_code_expires_minutes: int = 10
email_code_scenes: Tuple[str, ...] = ("register", "reset", "login")
# ===== 管理员自动信任的邮箱(逗号分隔,登录后自动授予 admin <20>?=====
admin_emails: List[str] = []
class Config:
validate_assignment = True
@property
def fastapi_kwargs(self) -> Dict[str, Any]:
return {
"debug": self.debug,
"docs_url": self.docs_url,
"openapi_prefix": self.openapi_prefix,
"openapi_url": self.openapi_url,
"redoc_url": self.redoc_url,
"title": self.title,
"version": self.version,
}
def configure_logging(self) -> None:
logging.getLogger().handlers = [InterceptHandler()]
for logger_name in self.loggers:
logging_logger = logging.getLogger(logger_name)
logging_logger.handlers = [InterceptHandler(level=self.logging_level)]
logger.configure(handlers=[{"sink": sys.stderr, "level": self.logging_level}])