33from datetime import datetime
44from typing import Any
55
6- from asgiref .sync import sync_to_async
7- from pydantic import validate_arguments , BaseModel
6+ from pydantic import BaseModel
87
98from backend .app .core .conf import settings
109from backend .app .utils .encoders import jsonable_encoder
@@ -20,7 +19,8 @@ class ResponseModel(BaseModel):
2019
2120 .. tip::
2221
23- 如果你不想使用 ResponseBase 中的自定义编码器,可以使用此模型,返回数据将通过 fastapi 内部的编码器直接自动解析并返回
22+ 如果你不想使用 ResponseBase 中的自定义编码器,可以使用此模型,返回数据将通过 fastapi 内部的编码器自动解析并返回;
23+ 此返回模型会生成 openapi schema 文档
2424
2525 E.g. ::
2626
@@ -47,7 +47,8 @@ class ResponseBase:
4747
4848 .. tip::
4949
50- 此类中的返回方法将通过自定义编码器预解析,然后由 fastapi 内部的编码器再次处理并返回,可能存在性能损耗,取决于个人喜好
50+ 此类中的返回方法将通过自定义编码器预解析,然后由 fastapi 内部的编码器再次处理并返回,可能存在性能损耗,取决于个人喜好;
51+ 此返回模型不会生成 openapi schema 文档
5152
5253 E.g. ::
5354
@@ -57,47 +58,34 @@ def test():
5758 """ # noqa: E501
5859
5960 @staticmethod
60- @sync_to_async
61- def __json_encoder (data : Any , exclude : _ExcludeData | None = None , ** kwargs ):
62- custom_encoder = {datetime : lambda x : x .strftime (settings .DATETIME_FORMAT )}
63- kwargs .update ({'custom_encoder' : custom_encoder })
64- result = jsonable_encoder (data , exclude = exclude , ** kwargs )
65- return result
66-
67- @validate_arguments
68- async def success (
69- self ,
70- * ,
71- code : int = 200 ,
72- msg : str = 'Success' ,
73- data : Any | None = None ,
74- exclude : _ExcludeData | None = None ,
75- ** kwargs
61+ async def __response (
62+ * , code : int = None , msg : str = None , data : Any | None = None , exclude : _ExcludeData | None = None , ** kwargs
7663 ) -> dict :
7764 """
7865 请求成功返回通用方法
7966
8067 :param code: 返回状态码
8168 :param msg: 返回信息
8269 :param data: 返回数据
83- :param exclude: 排除返回数据(data)字段
70+ :param exclude: 返回数据字段排除
71+ :param kwargs: jsonable_encoder 配置项
8472 :return:
8573 """
86- data = data if data is None else await self .__json_encoder (data , exclude , ** kwargs )
74+ if data is not None :
75+ custom_encoder = {datetime : lambda x : x .strftime (settings .DATETIME_FORMAT )}
76+ kwargs .update ({'custom_encoder' : custom_encoder })
77+ data = jsonable_encoder (data , exclude = exclude , ** kwargs )
8778 return {'code' : code , 'msg' : msg , 'data' : data }
8879
89- @validate_arguments
80+ async def success (
81+ self , * , code = 200 , msg = 'Success' , data : Any | None = None , exclude : _ExcludeData | None = None , ** kwargs
82+ ) -> dict :
83+ return await self .__response (code = code , msg = msg , data = data , exclude = exclude , ** kwargs )
84+
9085 async def fail (
91- self ,
92- * ,
93- code : int = 400 ,
94- msg : str = 'Bad Request' ,
95- data : Any = None ,
96- exclude : _ExcludeData | None = None ,
97- ** kwargs
86+ self , * , code = 400 , msg = 'Bad Request' , data : Any = None , exclude : _ExcludeData | None = None , ** kwargs
9887 ) -> dict :
99- data = data if data is None else await self .__json_encoder (data , exclude , ** kwargs )
100- return {'code' : code , 'msg' : msg , 'data' : data }
88+ return await self .__response (code = code , msg = msg , data = data , exclude = exclude , ** kwargs )
10189
10290
10391response_base = ResponseBase ()
0 commit comments