response.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. # -*- coding: utf-8 -*-
  2. from typing import Any, Mapping
  3. from fastapi import status
  4. from fastapi.responses import JSONResponse, StreamingResponse, FileResponse
  5. from starlette.background import BackgroundTask
  6. from pydantic import Field, BaseModel
  7. from app.common.constant import RET
  8. class ResponseSchema(BaseModel):
  9. """响应模型"""
  10. code: int = Field(default=RET.OK.code, description="业务状态码")
  11. msg: str = Field(default=RET.OK.msg, description="响应消息")
  12. data: Any = Field(default=None, description="响应数据")
  13. status_code: int = Field(default=status.HTTP_200_OK, description="HTTP状态码")
  14. success: bool = Field(default=True, description='操作是否成功')
  15. class SuccessResponse(JSONResponse):
  16. """成功响应类"""
  17. def __init__(
  18. self,
  19. data: Any = None,
  20. msg: str = RET.OK.msg,
  21. code: int = RET.OK.code,
  22. status_code: int = status.HTTP_200_OK,
  23. success: bool = True
  24. ) -> None:
  25. """
  26. 初始化成功响应类
  27. 参数:
  28. - data (Any | None): 响应数据。
  29. - msg (str): 响应消息。
  30. - code (int): 业务状态码。
  31. - status_code (int): HTTP 状态码。
  32. - success (bool): 操作是否成功。
  33. 返回:
  34. - None
  35. """
  36. content = ResponseSchema(
  37. code=code,
  38. msg=msg,
  39. data=data,
  40. status_code=status_code,
  41. success=success
  42. ).model_dump()
  43. super().__init__(content=content, status_code=status_code)
  44. class ErrorResponse(JSONResponse):
  45. """错误响应类"""
  46. def __init__(
  47. self,
  48. data: Any = None,
  49. msg: str = RET.ERROR.msg,
  50. code: int = RET.ERROR.code,
  51. status_code: int = status.HTTP_400_BAD_REQUEST,
  52. success: bool = False
  53. ) -> None:
  54. """
  55. 初始化错误响应类
  56. 参数:
  57. - data (Any): 响应数据。
  58. - msg (str): 响应消息。
  59. - code (int): 业务状态码。
  60. - status_code (int): HTTP 状态码。
  61. - success (bool): 操作是否成功。
  62. 返回:
  63. - None
  64. """
  65. content = ResponseSchema(
  66. code=code,
  67. msg=msg,
  68. data=data,
  69. status_code=status_code,
  70. success=success
  71. ).model_dump()
  72. super().__init__(content=content, status_code=status_code)
  73. class StreamResponse(StreamingResponse):
  74. """流式响应类"""
  75. def __init__(
  76. self,
  77. data: Any = None,
  78. status_code: int = status.HTTP_200_OK,
  79. headers: Mapping[str, str] | None = None,
  80. media_type: str | None = None,
  81. background: BackgroundTask | None = None
  82. ) -> None:
  83. """
  84. 初始化流式响应类
  85. 参数:
  86. - data (Any): 响应数据。
  87. - status_code (int): HTTP 状态码。
  88. - headers (Mapping[str, str] | None): 响应头。
  89. - media_type (str | None): 媒体类型。
  90. - background (BackgroundTask | None): 后台任务。
  91. 返回:
  92. - None
  93. """
  94. super().__init__(
  95. content=data,
  96. status_code=status_code,
  97. media_type=media_type, # 文件类型
  98. headers=headers, # 文件名
  99. background=background # 文件大小
  100. )
  101. class UploadFileResponse(FileResponse):
  102. """
  103. 文件响应
  104. """
  105. def __init__(
  106. self,
  107. file_path: str,
  108. filename: str,
  109. media_type: str = "application/octet-stream",
  110. headers: Mapping[str, str] | None = None,
  111. background: BackgroundTask | None = None,
  112. status_code: int = 200
  113. ):
  114. """
  115. 初始化文件响应类
  116. 参数:
  117. - file_path (str): 文件路径。
  118. - filename (str): 文件名。
  119. - media_type (str): 文件类型。
  120. - headers (Mapping[str, str] | None): 响应头。
  121. - background (BackgroundTask | None): 后台任务。
  122. - status_code (int): HTTP 状态码。
  123. 返回:
  124. - None
  125. """
  126. super().__init__(
  127. path=file_path,
  128. status_code=status_code,
  129. headers=headers,
  130. media_type=media_type,
  131. background=background,
  132. filename=filename,
  133. stat_result=None,
  134. method=None,
  135. content_disposition_type="attachment"
  136. )