from typing import Any, Generic, Optional, TypeVar from pydantic import BaseModel, ConfigDict, field_validator from app.runtime.localization import LocaleHelper DataT = TypeVar("DataT") class Response(BaseModel, Generic[DataT]): """统一接口响应结构,仅允许业务数据类型随接口变化。""" model_config = ConfigDict( extra="forbid", json_schema_extra={"required": ["success", "message", "data"]} ) # 状态 success: bool # 消息文本 message: str = "" # 数据 data: Optional[DataT] = None @field_validator("message", mode="before") @classmethod def localize_message(cls, value: Any) -> str: """按当前请求语言直接本地化消息文本,并将空消息归一为空字符串。""" if value is None: return "" message = str(value) if not message: return "" return LocaleHelper.translate_text( message, locale=LocaleHelper.get_current_locale() ) class ValidationIssue(BaseModel): """请求参数校验失败时返回的单项错误信息。""" # 参数位置 location: list[str | int] # 错误说明 message: str # 错误类型 error_type: str