jiachenlong/backend/app/core/config.py

72 lines
3.1 KiB
Python
Raw Normal View History

2026-04-12 09:49:18 +08:00
# 配置管理 - 集中管理所有环境变量和敏感配置
import os
from functools import lru_cache
from typing import Optional
class Settings:
"""应用配置类"""
def __init__(self):
# 阿里云百炼AI (DASHSCOPE) API Key - 必须设置,无默认值
2026-04-12 09:49:18 +08:00
self.DASHSCOPE_API_KEY: Optional[str] = os.getenv("DASHSCOPE_API_KEY")
# 阿里云短信服务配置 - 必须设置,无默认值
self.SMS_ACCESS_KEY_ID: Optional[str] = os.getenv("SMS_ACCESS_KEY_ID")
self.SMS_ACCESS_KEY_SECRET: Optional[str] = os.getenv("SMS_ACCESS_KEY_SECRET")
self.SMS_SIGN_NAME: str = os.getenv("SMS_SIGN_NAME", "甲辰藏品")
self.SMS_TEMPLATE_CODE: str = os.getenv("SMS_TEMPLATE_CODE", "SMS_xxx")
2026-04-12 09:49:18 +08:00
# 数据库配置 - 必须设置,无默认值
self.DATABASE_URL: Optional[str] = os.getenv("DATABASE_URL")
2026-04-12 09:49:18 +08:00
# JWT配置
self.SECRET_KEY: str = os.getenv("SECRET_KEY") # 必须设置,无默认值
2026-04-12 09:49:18 +08:00
self.ALGORITHM: str = os.getenv("ALGORITHM", "HS256")
self.ACCESS_TOKEN_EXPIRE_MINUTES: int = int(os.getenv("ACCESS_TOKEN_EXPIRE_MINUTES", "10080")) # 7天
# OSS配置 - 必须设置,无默认值
2026-04-12 09:49:18 +08:00
self.OSS_ACCESS_KEY_ID: Optional[str] = os.getenv("OSS_ACCESS_KEY_ID")
self.OSS_ACCESS_KEY_SECRET: Optional[str] = os.getenv("OSS_ACCESS_KEY_SECRET")
self.OSS_BUCKET: str = os.getenv("OSS_BUCKET", "jiachenlong-oss")
self.OSS_ENDPOINT: str = os.getenv("OSS_ENDPOINT", "oss-cn-hangzhou.aliyuncs.com")
# Redis配置 (可选,用于限流和缓存)
self.REDIS_URL: Optional[str] = os.getenv("REDIS_URL")
# API Rate Limiting
self.RATE_LIMIT_ENABLED: bool = os.getenv("RATE_LIMIT_ENABLED", "true").lower() == "true"
self.RATE_LIMIT_SMS_PER_MINUTE: int = int(os.getenv("RATE_LIMIT_SMS_PER_MINUTE", "3"))
self.RATE_LIMIT_OCR_PER_MINUTE: int = int(os.getenv("RATE_LIMIT_OCR_PER_MINUTE", "10"))
self.RATE_LIMIT_BATCH_PER_MINUTE: int = int(os.getenv("RATE_LIMIT_BATCH_PER_MINUTE", "5"))
self.RATE_LIMIT_API_PER_MINUTE: int = int(os.getenv("RATE_LIMIT_API_PER_MINUTE", "60"))
# 管理员账号 - 必须设置,无默认值
self.ADMIN_USERNAME: Optional[str] = os.getenv("ADMIN_USERNAME")
self.ADMIN_PASSWORD: Optional[str] = os.getenv("ADMIN_PASSWORD")
2026-04-12 09:49:18 +08:00
def get_dashscope_api_key(self) -> str:
"""获取阿里云百炼API Key"""
if not self.DASHSCOPE_API_KEY:
raise ValueError("DASHSCOPE_API_KEY 环境变量未设置")
return self.DASHSCOPE_API_KEY
def get_sms_config(self) -> dict:
"""获取短信配置"""
return {
"access_key_id": self.SMS_ACCESS_KEY_ID,
"access_key_secret": self.SMS_ACCESS_KEY_SECRET,
"sign_name": self.SMS_SIGN_NAME,
"template_code": self.SMS_TEMPLATE_CODE,
}
@lru_cache()
def get_settings() -> Settings:
"""获取单例配置实例"""
return Settings()
# 导出便捷访问
settings = get_settings()