feat: 接入fastapi
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
"""定义统一 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"
|
||||
)
|
||||
Reference in New Issue
Block a user