upload project source code
This commit is contained in:
172
后端源码/yifan.action-ai.cn/api/app/common/response.py
Normal file
172
后端源码/yifan.action-ai.cn/api/app/common/response.py
Normal file
@@ -0,0 +1,172 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from typing import Any, Mapping
|
||||
from fastapi import status
|
||||
from fastapi.responses import JSONResponse, StreamingResponse, FileResponse
|
||||
from fastapi.encoders import jsonable_encoder
|
||||
from starlette.background import BackgroundTask
|
||||
from pydantic import Field, BaseModel
|
||||
|
||||
from app.common.constant import RET
|
||||
|
||||
class ResponseSchema(BaseModel):
|
||||
"""响应模型"""
|
||||
code: int = Field(default=RET.OK.code, description="业务状态码")
|
||||
msg: str = Field(default=RET.OK.msg, description="响应消息")
|
||||
data: Any = 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,
|
||||
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=jsonable_encoder(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=jsonable_encoder(content), status_code=status_code)
|
||||
|
||||
|
||||
class StreamResponse(StreamingResponse):
|
||||
"""流式响应类"""
|
||||
|
||||
# 默认流式响应头,确保浏览器实时处理流式数据
|
||||
DEFAULT_STREAM_HEADERS = {
|
||||
"Cache-Control": "no-cache, no-store, must-revalidate",
|
||||
"X-Accel-Buffering": "no", # 禁用 Nginx 缓冲
|
||||
"Connection": "keep-alive",
|
||||
"Content-Encoding": "identity", # 禁用 GZip 压缩,避免缓冲流式数据
|
||||
}
|
||||
|
||||
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
|
||||
"""
|
||||
# 合并默认流式响应头和自定义响应头
|
||||
merged_headers = dict(self.DEFAULT_STREAM_HEADERS)
|
||||
if headers:
|
||||
merged_headers.update(headers)
|
||||
|
||||
super().__init__(
|
||||
content=data,
|
||||
status_code=status_code,
|
||||
media_type=media_type,
|
||||
headers=merged_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
|
||||
):
|
||||
"""
|
||||
初始化文件响应类
|
||||
|
||||
参数:
|
||||
- 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"
|
||||
)
|
||||
Reference in New Issue
Block a user