267 lines
9.8 KiB
Python
Raw Normal View History

from datetime import datetime
2024-01-22 23:46:27 +08:00
from fastapi import status
from fastapi.encoders import jsonable_encoder
from fastapi.responses import JSONResponse, Response, StreamingResponse
2024-01-22 23:46:27 +08:00
from pydantic import BaseModel
2025-02-19 10:54:56 +08:00
from starlette.background import BackgroundTask
from typing import Any, Dict, Mapping, Optional
2024-07-03 16:41:20 +08:00
from config.constant import HttpStatusConstant
2024-01-22 23:46:27 +08:00
class ResponseUtil:
"""
响应工具类
"""
@classmethod
def success(
cls,
msg: str = '操作成功',
data: Optional[Any] = None,
rows: Optional[Any] = None,
dict_content: Optional[Dict] = None,
model_content: Optional[BaseModel] = None,
2025-02-19 10:54:56 +08:00
headers: Optional[Mapping[str, str]] = None,
media_type: Optional[str] = None,
background: Optional[BackgroundTask] = None,
) -> Response:
2024-01-22 23:46:27 +08:00
"""
成功响应方法
2024-01-22 23:46:27 +08:00
:param msg: 可选自定义成功响应信息
:param data: 可选成功响应结果中属性为data的值
:param rows: 可选成功响应结果中属性为rows的值
:param dict_content: 可选dict类型成功响应结果中自定义属性的值
:param model_content: 可选BaseModel类型成功响应结果中自定义属性的值
2025-02-19 10:54:56 +08:00
:param headers: 可选响应头信息
:param media_type: 可选响应结果媒体类型
:param background: 可选响应返回后执行的后台任务
2024-01-22 23:46:27 +08:00
:return: 成功响应结果
"""
result = {'code': HttpStatusConstant.SUCCESS, 'msg': msg}
2024-01-22 23:46:27 +08:00
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))
result.update({'success': True, 'time': datetime.now()})
2025-02-19 10:54:56 +08:00
return JSONResponse(
status_code=status.HTTP_200_OK,
content=jsonable_encoder(result),
headers=headers,
media_type=media_type,
background=background,
)
2024-01-22 23:46:27 +08:00
@classmethod
def failure(
cls,
msg: str = '操作失败',
data: Optional[Any] = None,
rows: Optional[Any] = None,
dict_content: Optional[Dict] = None,
model_content: Optional[BaseModel] = None,
2025-02-19 10:54:56 +08:00
headers: Optional[Mapping[str, str]] = None,
media_type: Optional[str] = None,
background: Optional[BackgroundTask] = None,
) -> Response:
2024-01-22 23:46:27 +08:00
"""
失败响应方法
2024-01-22 23:46:27 +08:00
:param msg: 可选自定义失败响应信息
:param data: 可选失败响应结果中属性为data的值
:param rows: 可选失败响应结果中属性为rows的值
:param dict_content: 可选dict类型失败响应结果中自定义属性的值
:param model_content: 可选BaseModel类型失败响应结果中自定义属性的值
2025-02-19 10:54:56 +08:00
:param headers: 可选响应头信息
:param media_type: 可选响应结果媒体类型
:param background: 可选响应返回后执行的后台任务
2024-01-22 23:46:27 +08:00
:return: 失败响应结果
"""
result = {'code': HttpStatusConstant.WARN, 'msg': msg}
2024-01-22 23:46:27 +08:00
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))
result.update({'success': False, 'time': datetime.now()})
2025-02-19 10:54:56 +08:00
return JSONResponse(
status_code=status.HTTP_200_OK,
content=jsonable_encoder(result),
headers=headers,
media_type=media_type,
background=background,
)
2024-01-22 23:46:27 +08:00
@classmethod
def unauthorized(
cls,
msg: str = '登录信息已过期,访问系统资源失败',
data: Optional[Any] = None,
rows: Optional[Any] = None,
dict_content: Optional[Dict] = None,
model_content: Optional[BaseModel] = None,
2025-02-19 10:54:56 +08:00
headers: Optional[Mapping[str, str]] = None,
media_type: Optional[str] = None,
background: Optional[BackgroundTask] = None,
) -> Response:
2024-01-22 23:46:27 +08:00
"""
未认证响应方法
2024-01-22 23:46:27 +08:00
:param msg: 可选自定义未认证响应信息
:param data: 可选未认证响应结果中属性为data的值
:param rows: 可选未认证响应结果中属性为rows的值
:param dict_content: 可选dict类型未认证响应结果中自定义属性的值
:param model_content: 可选BaseModel类型未认证响应结果中自定义属性的值
2025-02-19 10:54:56 +08:00
:param headers: 可选响应头信息
:param media_type: 可选响应结果媒体类型
:param background: 可选响应返回后执行的后台任务
2024-01-22 23:46:27 +08:00
:return: 未认证响应结果
"""
result = {'code': HttpStatusConstant.UNAUTHORIZED, 'msg': msg}
2024-01-22 23:46:27 +08:00
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))
result.update({'success': False, 'time': datetime.now()})
2025-02-19 10:54:56 +08:00
return JSONResponse(
status_code=status.HTTP_200_OK,
content=jsonable_encoder(result),
headers=headers,
media_type=media_type,
background=background,
)
2024-01-22 23:46:27 +08:00
@classmethod
def forbidden(
cls,
msg: str = '该用户无此接口权限',
data: Optional[Any] = None,
rows: Optional[Any] = None,
dict_content: Optional[Dict] = None,
model_content: Optional[BaseModel] = None,
2025-02-19 10:54:56 +08:00
headers: Optional[Mapping[str, str]] = None,
media_type: Optional[str] = None,
background: Optional[BackgroundTask] = None,
) -> Response:
2024-01-22 23:46:27 +08:00
"""
未授权响应方法
:param msg: 可选自定义未授权响应信息
:param data: 可选未授权响应结果中属性为data的值
:param rows: 可选未授权响应结果中属性为rows的值
:param dict_content: 可选dict类型未授权响应结果中自定义属性的值
:param model_content: 可选BaseModel类型未授权响应结果中自定义属性的值
2025-02-19 10:54:56 +08:00
:param headers: 可选响应头信息
:param media_type: 可选响应结果媒体类型
:param background: 可选响应返回后执行的后台任务
:return: 未授权响应结果
2024-01-22 23:46:27 +08:00
"""
result = {'code': HttpStatusConstant.FORBIDDEN, 'msg': msg}
2024-01-22 23:46:27 +08:00
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))
result.update({'success': False, 'time': datetime.now()})
2025-02-19 10:54:56 +08:00
return JSONResponse(
status_code=status.HTTP_200_OK,
content=jsonable_encoder(result),
headers=headers,
media_type=media_type,
background=background,
)
2024-01-22 23:46:27 +08:00
@classmethod
def error(
cls,
msg: str = '接口异常',
data: Optional[Any] = None,
rows: Optional[Any] = None,
dict_content: Optional[Dict] = None,
model_content: Optional[BaseModel] = None,
2025-02-19 10:54:56 +08:00
headers: Optional[Mapping[str, str]] = None,
media_type: Optional[str] = None,
background: Optional[BackgroundTask] = None,
) -> Response:
2024-01-22 23:46:27 +08:00
"""
错误响应方法
2024-01-22 23:46:27 +08:00
:param msg: 可选自定义错误响应信息
:param data: 可选错误响应结果中属性为data的值
:param rows: 可选错误响应结果中属性为rows的值
:param dict_content: 可选dict类型错误响应结果中自定义属性的值
:param model_content: 可选BaseModel类型错误响应结果中自定义属性的值
2025-02-19 10:54:56 +08:00
:param headers: 可选响应头信息
:param media_type: 可选响应结果媒体类型
:param background: 可选响应返回后执行的后台任务
2024-01-22 23:46:27 +08:00
:return: 错误响应结果
"""
result = {'code': HttpStatusConstant.ERROR, 'msg': msg}
2024-01-22 23:46:27 +08:00
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))
result.update({'success': False, 'time': datetime.now()})
2025-02-19 10:54:56 +08:00
return JSONResponse(
status_code=status.HTTP_200_OK,
content=jsonable_encoder(result),
headers=headers,
media_type=media_type,
background=background,
)
2024-01-22 23:46:27 +08:00
@classmethod
2025-02-19 10:54:56 +08:00
def streaming(
cls,
*,
data: Any = None,
headers: Optional[Mapping[str, str]] = None,
media_type: Optional[str] = None,
background: Optional[BackgroundTask] = None,
) -> Response:
2024-01-22 23:46:27 +08:00
"""
流式响应方法
2024-01-22 23:46:27 +08:00
:param data: 流式传输的内容
2025-02-19 10:54:56 +08:00
:param headers: 可选响应头信息
:param media_type: 可选响应结果媒体类型
:param background: 可选响应返回后执行的后台任务
2024-01-22 23:46:27 +08:00
:return: 流式响应结果
"""
2025-02-19 10:54:56 +08:00
return StreamingResponse(
status_code=status.HTTP_200_OK, content=data, headers=headers, media_type=media_type, background=background
)