129 lines
4.0 KiB
Python
129 lines
4.0 KiB
Python
![]() |
from typing import Any, Dict, Generic, Optional, TypeVar, Union
|
|||
|
from pydantic import BaseModel, Field
|
|||
|
from datetime import datetime
|
|||
|
import uuid
|
|||
|
from fastapi.responses import JSONResponse
|
|||
|
from fastapi import status
|
|||
|
|
|||
|
# 定义泛型类型变量
|
|||
|
T = TypeVar('T')
|
|||
|
|
|||
|
class ResponseModel(BaseModel, Generic[T]):
|
|||
|
"""统一API响应模型"""
|
|||
|
code: int = Field(0, description="状态码,0表示成功,非0表示错误")
|
|||
|
message: str = Field("success", description="响应消息")
|
|||
|
data: Optional[T] = Field(None, description="响应数据")
|
|||
|
request_id: str = Field(default_factory=lambda: str(uuid.uuid4())[:8], description="请求ID")
|
|||
|
timestamp: datetime = Field(default_factory=datetime.now, description="响应时间戳")
|
|||
|
|
|||
|
class Config:
|
|||
|
arbitrary_types_allowed = True
|
|||
|
json_encoders = {
|
|||
|
datetime: lambda dt: dt.isoformat()
|
|||
|
}
|
|||
|
|
|||
|
class ResponseFactory:
|
|||
|
"""响应工厂类,用于生成标准格式的响应"""
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def success(data: Any = None, message: str = "success") -> Dict[str, Any]:
|
|||
|
"""生成成功响应"""
|
|||
|
return ResponseModel(
|
|||
|
code=200,
|
|||
|
message=message,
|
|||
|
data=data
|
|||
|
).model_dump(exclude_none=True)
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def error(code: int = 1, message: str = "error", data: Any = None) -> Dict[str, Any]:
|
|||
|
"""生成错误响应"""
|
|||
|
return ResponseModel(
|
|||
|
code=code,
|
|||
|
message=message,
|
|||
|
data=data
|
|||
|
).model_dump(exclude_none=True)
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def failed_validation(message: str = "数据验证失败", errors: Any = None) -> Dict[str, Any]:
|
|||
|
"""生成验证失败响应"""
|
|||
|
return ResponseModel(
|
|||
|
code=400,
|
|||
|
message=message,
|
|||
|
data=errors
|
|||
|
).model_dump(exclude_none=True)
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def not_found(message: str = "资源不存在", data: Any = None) -> Dict[str, Any]:
|
|||
|
"""生成资源不存在响应"""
|
|||
|
return ResponseModel(
|
|||
|
code=404,
|
|||
|
message=message,
|
|||
|
data=data
|
|||
|
).model_dump(exclude_none=True)
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def unauthorized(message: str = "未授权访问", data: Any = None) -> Dict[str, Any]:
|
|||
|
"""生成未授权响应"""
|
|||
|
return ResponseModel(
|
|||
|
code=401,
|
|||
|
message=message,
|
|||
|
data=data
|
|||
|
).model_dump(exclude_none=True)
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def forbidden(message: str = "禁止访问", data: Any = None) -> Dict[str, Any]:
|
|||
|
"""生成禁止访问响应"""
|
|||
|
return ResponseModel(
|
|||
|
code=403,
|
|||
|
message=message,
|
|||
|
data=data
|
|||
|
).model_dump(exclude_none=True)
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def server_error(message: str = "服务器内部错误", data: Any = None) -> Dict[str, Any]:
|
|||
|
"""生成服务器错误响应"""
|
|||
|
return ResponseModel(
|
|||
|
code=500,
|
|||
|
message=message,
|
|||
|
data=data
|
|||
|
).model_dump(exclude_none=True)
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def json_response(
|
|||
|
data: Any = None,
|
|||
|
message: str = "success",
|
|||
|
code: int = 0,
|
|||
|
status_code: int = status.HTTP_200_OK
|
|||
|
) -> JSONResponse:
|
|||
|
"""生成JSONResponse对象"""
|
|||
|
content = ResponseModel(
|
|||
|
code=code,
|
|||
|
message=message,
|
|||
|
data=data
|
|||
|
).model_dump(exclude_none=True)
|
|||
|
|
|||
|
return JSONResponse(
|
|||
|
content=content,
|
|||
|
status_code=status_code
|
|||
|
)
|
|||
|
|
|||
|
class Result:
|
|||
|
"""统一API响应工具类"""
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def success(data: Any = None, message: str = "success") -> Dict[str, Any]:
|
|||
|
"""返回成功响应"""
|
|||
|
return {
|
|||
|
"code": 0,
|
|||
|
"message": message,
|
|||
|
"data": data
|
|||
|
}
|
|||
|
|
|||
|
@staticmethod
|
|||
|
def error(code: int = 1, message: str = "error", data: Any = None) -> Dict[str, Any]:
|
|||
|
"""返回错误响应"""
|
|||
|
return {
|
|||
|
"code": code,
|
|||
|
"message": message,
|
|||
|
"data": data
|
|||
|
}
|