226 lines
7.2 KiB
Python
226 lines
7.2 KiB
Python
# _*_ coding : UTF-8 _*_
|
|
# @Time : 2025/01/18 02:13
|
|
# @UpdateTime : 2025/01/18 02:13
|
|
# @Author : sonder
|
|
# @File : response.py
|
|
# @Software : PyCharm
|
|
# @Comment : 本程序
|
|
|
|
from datetime import datetime
|
|
from typing import Any, Dict, Optional
|
|
|
|
from fastapi import status
|
|
from fastapi.encoders import jsonable_encoder
|
|
from fastapi.responses import JSONResponse, StreamingResponse
|
|
from pydantic import BaseModel
|
|
|
|
from config.constant import HttpStatusConstant
|
|
|
|
|
|
class Response:
|
|
"""
|
|
响应工具类,用于统一封装接口返回格式。
|
|
"""
|
|
|
|
@classmethod
|
|
def _build_response(
|
|
cls,
|
|
code: int,
|
|
msg: str,
|
|
data: Optional[Any] = None,
|
|
rows: Optional[Any] = None,
|
|
dict_content: Optional[Dict] = None,
|
|
model_content: Optional[BaseModel] = None,
|
|
success: bool = True,
|
|
) -> Dict:
|
|
"""
|
|
构建统一的响应结果字典。
|
|
|
|
:param code: 状态码
|
|
:param msg: 响应消息
|
|
:param data: 响应数据
|
|
:param rows: 响应行数据(通常用于分页)
|
|
:param dict_content: 自定义字典内容
|
|
:param model_content: 自定义 Pydantic 模型内容
|
|
:param success: 是否成功
|
|
:return: 统一的响应结果字典
|
|
"""
|
|
result = {
|
|
"code": code,
|
|
"msg": msg,
|
|
"success": success,
|
|
"time": datetime.now().isoformat(), # 添加时间戳
|
|
}
|
|
|
|
# 添加可选字段
|
|
if data is not None:
|
|
result["data"] = data
|
|
if rows is not None:
|
|
result["rows"] = rows
|
|
if dict_content is not None:
|
|
result.update(dict_content)
|
|
if model_content is not None:
|
|
result.update(model_content.model_dump(by_alias=True))
|
|
|
|
return result
|
|
|
|
@classmethod
|
|
def success(
|
|
cls,
|
|
msg: str = "操作成功",
|
|
data: Optional[Any] = None,
|
|
rows: Optional[Any] = None,
|
|
dict_content: Optional[Dict] = None,
|
|
model_content: Optional[BaseModel] = None,
|
|
) -> JSONResponse:
|
|
"""
|
|
成功响应方法。
|
|
|
|
:param msg: 响应消息,默认为 "操作成功"
|
|
:param data: 响应数据
|
|
:param rows: 响应行数据(通常用于分页)
|
|
:param dict_content: 自定义字典内容
|
|
:param model_content: 自定义 Pydantic 模型内容
|
|
:return: JSONResponse 对象
|
|
"""
|
|
result = cls._build_response(
|
|
code=HttpStatusConstant.SUCCESS,
|
|
msg=msg,
|
|
data=data,
|
|
rows=rows,
|
|
dict_content=dict_content,
|
|
model_content=model_content,
|
|
success=True,
|
|
)
|
|
return JSONResponse(status_code=status.HTTP_200_OK, content=jsonable_encoder(result))
|
|
|
|
@classmethod
|
|
def failure(
|
|
cls,
|
|
msg: str = "操作失败",
|
|
data: Optional[Any] = None,
|
|
rows: Optional[Any] = None,
|
|
dict_content: Optional[Dict] = None,
|
|
model_content: Optional[BaseModel] = None,
|
|
) -> JSONResponse:
|
|
"""
|
|
失败响应方法。
|
|
|
|
:param msg: 响应消息,默认为 "操作失败"
|
|
:param data: 响应数据
|
|
:param rows: 响应行数据(通常用于分页)
|
|
:param dict_content: 自定义字典内容
|
|
:param model_content: 自定义 Pydantic 模型内容
|
|
:return: JSONResponse 对象
|
|
"""
|
|
result = cls._build_response(
|
|
code=400,
|
|
msg=msg,
|
|
data=data,
|
|
rows=rows,
|
|
dict_content=dict_content,
|
|
model_content=model_content,
|
|
success=False,
|
|
)
|
|
return JSONResponse(status_code=status.HTTP_200_OK, content=jsonable_encoder(result))
|
|
|
|
@classmethod
|
|
def unauthorized(
|
|
cls,
|
|
msg: str = "登录信息已过期,访问系统资源失败",
|
|
data: Optional[Any] = None,
|
|
rows: Optional[Any] = None,
|
|
dict_content: Optional[Dict] = None,
|
|
model_content: Optional[BaseModel] = None,
|
|
) -> JSONResponse:
|
|
"""
|
|
未认证响应方法。
|
|
|
|
:param msg: 响应消息,默认为 "登录信息已过期,访问系统资源失败"
|
|
:param data: 响应数据
|
|
:param rows: 响应行数据(通常用于分页)
|
|
:param dict_content: 自定义字典内容
|
|
:param model_content: 自定义 Pydantic 模型内容
|
|
:return: JSONResponse 对象
|
|
"""
|
|
result = cls._build_response(
|
|
code=HttpStatusConstant.UNAUTHORIZED,
|
|
msg=msg,
|
|
data=data,
|
|
rows=rows,
|
|
dict_content=dict_content,
|
|
model_content=model_content,
|
|
success=False,
|
|
)
|
|
return JSONResponse(status_code=status.HTTP_200_OK, content=jsonable_encoder(result))
|
|
|
|
@classmethod
|
|
def forbidden(
|
|
cls,
|
|
msg: str = "该用户无此接口权限",
|
|
data: Optional[Any] = None,
|
|
rows: Optional[Any] = None,
|
|
dict_content: Optional[Dict] = None,
|
|
model_content: Optional[BaseModel] = None,
|
|
) -> JSONResponse:
|
|
"""
|
|
未授权响应方法。
|
|
|
|
:param msg: 响应消息,默认为 "该用户无此接口权限"
|
|
:param data: 响应数据
|
|
:param rows: 响应行数据(通常用于分页)
|
|
:param dict_content: 自定义字典内容
|
|
:param model_content: 自定义 Pydantic 模型内容
|
|
:return: JSONResponse 对象
|
|
"""
|
|
result = cls._build_response(
|
|
code=HttpStatusConstant.FORBIDDEN,
|
|
msg=msg,
|
|
data=data,
|
|
rows=rows,
|
|
dict_content=dict_content,
|
|
model_content=model_content,
|
|
success=False,
|
|
)
|
|
return JSONResponse(status_code=status.HTTP_200_OK, content=jsonable_encoder(result))
|
|
|
|
@classmethod
|
|
def error(
|
|
cls,
|
|
msg: str = "接口异常",
|
|
data: Optional[Any] = None,
|
|
rows: Optional[Any] = None,
|
|
dict_content: Optional[Dict] = None,
|
|
model_content: Optional[BaseModel] = None,
|
|
) -> JSONResponse:
|
|
"""
|
|
错误响应方法。
|
|
|
|
:param msg: 响应消息,默认为 "接口异常"
|
|
:param data: 响应数据
|
|
:param rows: 响应行数据(通常用于分页)
|
|
:param dict_content: 自定义字典内容
|
|
:param model_content: 自定义 Pydantic 模型内容
|
|
:return: JSONResponse 对象
|
|
"""
|
|
result = cls._build_response(
|
|
code=HttpStatusConstant.ERROR,
|
|
msg=msg,
|
|
data=data,
|
|
rows=rows,
|
|
dict_content=dict_content,
|
|
model_content=model_content,
|
|
success=False,
|
|
)
|
|
return JSONResponse(status_code=status.HTTP_200_OK, content=jsonable_encoder(result))
|
|
|
|
@classmethod
|
|
def streaming(cls, data: Any) -> StreamingResponse:
|
|
"""
|
|
流式响应方法。
|
|
|
|
:param data: 流式传输的内容
|
|
:return: StreamingResponse 对象
|
|
"""
|
|
return StreamingResponse(content=data, status_code=status.HTTP_200_OK)
|