Files
FastapiAdmin/backend/app/common/response.py
T
zhangtao 51f9a9acfa feat(前端): 添加页面切换动画功能并优化工作流节点样式
refactor(后端): 统一查询参数处理使用QueueEnum枚举

style(前端): 优化菜单搜索组件样式

fix(后端): 移除不支持的数据库类型dm

chore: 更新依赖和配置文件
2026-02-06 22:31:39 +08:00

163 lines
4.4 KiB
Python

from collections.abc import Mapping
from typing import Any, Generic
from fastapi import status
from fastapi.responses import FileResponse, JSONResponse, StreamingResponse
from pydantic import BaseModel, Field
from pydantic.types import T
from starlette.background import BackgroundTask
from app.common.constant import RET
class ResponseSchema(BaseModel, Generic[T]):
"""响应模型"""
code: int = Field(default=RET.OK.code, description="业务状态码")
msg: str = Field(default=RET.OK.msg, description="响应消息")
data: T | None = Field(default=None, description="响应数据")
status_code: int = Field(default=status.HTTP_200_OK, description="HTTP状态码")
success: bool = Field(default=True, description="操作是否成功")
class SuccessResponse(JSONResponse):
"""成功响应类"""
def __init__(
self,
data: Any | None = None,
msg: str = RET.OK.msg,
code: int = RET.OK.code,
status_code: int = status.HTTP_200_OK,
success: bool = True,
) -> None:
"""
初始化成功响应类
参数:
- data (Any | None): 响应数据。
- msg (str): 响应消息。
- code (int): 业务状态码。
- status_code (int): HTTP 状态码。
- success (bool): 操作是否成功。
返回:
- None
"""
content = ResponseSchema(
code=code,
msg=msg,
data=data,
status_code=status_code,
success=success,
).model_dump()
super().__init__(content=content, status_code=status_code)
class ErrorResponse(JSONResponse):
"""错误响应类"""
def __init__(
self,
data: Any = None,
msg: str = RET.ERROR.msg,
code: int = RET.ERROR.code,
status_code: int = status.HTTP_400_BAD_REQUEST,
success: bool = False,
) -> None:
"""
初始化错误响应类
参数:
- data (Any): 响应数据。
- msg (str): 响应消息。
- code (int): 业务状态码。
- status_code (int): HTTP 状态码。
- success (bool): 操作是否成功。
返回:
- None
"""
content = ResponseSchema(
code=code,
msg=msg,
data=data,
status_code=status_code,
success=success,
).model_dump()
super().__init__(content=content, status_code=status_code)
class StreamResponse(StreamingResponse):
"""流式响应类"""
def __init__(
self,
data: Any = None,
status_code: int = status.HTTP_200_OK,
headers: Mapping[str, str] | None = None,
media_type: str | None = None,
background: BackgroundTask | None = None,
) -> None:
"""
初始化流式响应类
参数:
- data (Any): 响应数据。
- status_code (int): HTTP 状态码。
- headers (Mapping[str, str] | None): 响应头。
- media_type (str | None): 媒体类型。
- background (BackgroundTask | None): 后台任务。
返回:
- None
"""
super().__init__(
content=data,
status_code=status_code,
media_type=media_type, # 文件类型
headers=headers, # 文件名
background=background, # 文件大小
)
class UploadFileResponse(FileResponse):
"""
文件响应
"""
def __init__(
self,
file_path: str,
filename: str,
media_type: str = "application/octet-stream",
headers: Mapping[str, str] | None = None,
background: BackgroundTask | None = None,
status_code: int = 200,
) -> None:
"""
初始化文件响应类
参数:
- file_path (str): 文件路径。
- filename (str): 文件名。
- media_type (str): 文件类型。
- headers (Mapping[str, str] | None): 响应头。
- background (BackgroundTask | None): 后台任务。
- status_code (int): HTTP 状态码。
返回:
- None
"""
super().__init__(
path=file_path,
status_code=status_code,
headers=headers,
media_type=media_type,
background=background,
filename=filename,
stat_result=None,
method=None,
content_disposition_type="attachment",
)