from functools import lru_cache from pydantic import Field from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", extra="ignore", ) app_name: str = "aiclient-api" debug: bool = False mysql_host: str = "127.0.0.1" mysql_port: int = 3306 mysql_user: str = "root" mysql_password: str = "" mysql_database: str = "aiclient" redis_url: str = "redis://127.0.0.1:6379/0" secret_key: str = Field(default="change-me-in-production") access_token_expire_minutes: int = 60 * 24 * 7 """AES-256 密钥:32 字节 Base64 或 64 位十六进制;为空则关闭 API 加解密。""" api_aes_key: str = "98cde5e64ee0da6ed0c5842f43a950aa0d8ae5087c43c8d8ee5d10bd8d571bb4" cors_origins: str = "http://localhost:1420" """对外图片/品牌资源基址,用于拼接 logo_url。""" api_public_base: str = "http://127.0.0.1:8001" @property def database_url(self) -> str: return ( f"mysql+aiomysql://{self.mysql_user}:{self.mysql_password}" f"@{self.mysql_host}:{self.mysql_port}/{self.mysql_database}" ) @property def cors_origin_list(self) -> list[str]: raw = self.cors_origins.strip() if raw == "*": return ["*"] return [o.strip() for o in raw.split(",") if o.strip()] @lru_cache def get_settings() -> Settings: return Settings()