3
3
from datetime import datetime
4
4
from typing import Any
5
5
6
- from asgiref .sync import sync_to_async
7
- from pydantic import validate_arguments , BaseModel
6
+ from pydantic import BaseModel
8
7
9
8
from backend .app .core .conf import settings
10
9
from backend .app .utils .encoders import jsonable_encoder
@@ -20,7 +19,8 @@ class ResponseModel(BaseModel):
20
19
21
20
.. tip::
22
21
23
- 如果你不想使用 ResponseBase 中的自定义编码器,可以使用此模型,返回数据将通过 fastapi 内部的编码器直接自动解析并返回
22
+ 如果你不想使用 ResponseBase 中的自定义编码器,可以使用此模型,返回数据将通过 fastapi 内部的编码器自动解析并返回;
23
+ 此返回模型会生成 openapi schema 文档
24
24
25
25
E.g. ::
26
26
@@ -47,7 +47,8 @@ class ResponseBase:
47
47
48
48
.. tip::
49
49
50
- 此类中的返回方法将通过自定义编码器预解析,然后由 fastapi 内部的编码器再次处理并返回,可能存在性能损耗,取决于个人喜好
50
+ 此类中的返回方法将通过自定义编码器预解析,然后由 fastapi 内部的编码器再次处理并返回,可能存在性能损耗,取决于个人喜好;
51
+ 此返回模型不会生成 openapi schema 文档
51
52
52
53
E.g. ::
53
54
@@ -57,47 +58,34 @@ def test():
57
58
""" # noqa: E501
58
59
59
60
@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
76
63
) -> dict :
77
64
"""
78
65
请求成功返回通用方法
79
66
80
67
:param code: 返回状态码
81
68
:param msg: 返回信息
82
69
:param data: 返回数据
83
- :param exclude: 排除返回数据(data)字段
70
+ :param exclude: 返回数据字段排除
71
+ :param kwargs: jsonable_encoder 配置项
84
72
:return:
85
73
"""
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 )
87
78
return {'code' : code , 'msg' : msg , 'data' : data }
88
79
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
+
90
85
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
98
87
) -> 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 )
101
89
102
90
103
91
response_base = ResponseBase ()
0 commit comments