41 lines
1.2 KiB
Python
41 lines
1.2 KiB
Python
"""定义统一 API 响应结构"""
|
|
|
|
from typing import Any, Generic, TypeVar
|
|
|
|
from pydantic import BaseModel, field_validator
|
|
|
|
DataT = TypeVar("DataT")
|
|
ResponseData = BaseModel | dict[str, Any] | list[Any] | None
|
|
|
|
|
|
class ApiResponse(BaseModel, Generic[DataT]):
|
|
code: int = 0
|
|
data: DataT | None = None
|
|
msg: str = ""
|
|
|
|
@field_validator("data")
|
|
@classmethod
|
|
def validate_data_shape(cls, value: DataT | None) -> DataT | None:
|
|
"""限制响应数据为对象、数组或空值"""
|
|
if value is not None and not isinstance(value, (BaseModel, dict, list)):
|
|
raise ValueError("响应 data 必须为对象、数组或 null")
|
|
return value
|
|
|
|
|
|
def success_response(
|
|
data: DataT | None = None,
|
|
msg: str = "",
|
|
) -> ApiResponse[DataT | dict[str, Any]]:
|
|
"""构造统一成功响应"""
|
|
response_data: DataT | dict[str, Any] = {} if data is None else data
|
|
return ApiResponse(code=0, data=response_data, msg=msg)
|
|
|
|
|
|
def error_content(
|
|
code: int, msg: str = "请求失败"
|
|
) -> dict[str, ResponseData | int | str]:
|
|
"""构造统一失败响应内容"""
|
|
return ApiResponse[ResponseData](code=code, data=None, msg=msg).model_dump(
|
|
mode="json"
|
|
)
|