@@ -19,15 +19,23 @@ def parse_error(
1919 :param raw: Whether this is a raw error or wrapped pydantic error
2020 :return: dict with name of the field (or "__all__") and actual message
2121 """
22+ print (err .type_ , err .loc , raw )
2223 if err .type_ == "value_error.str.regex" :
2324 message = "Provided value doesn't match valid format."
2425 elif err .type_ == "type_error.enum" :
2526 message = "One or more values provided are not valid."
2627 else :
2728 message = err .msg or ""
29+
30+ if err .type_ .startswith ("value_error.error_code" ):
31+ error_code = int (err .type_ .split ("." )[- 1 ])
32+ else :
33+ # default error code for non-custom errors is 400
34+ error_code = 400
35+
2836 if not raw :
2937 if len (err .loc ) == 2 :
30- if str (err .loc [0 ]) == "body" :
38+ if str (err .loc [0 ]) in [ "body" , "query" ] :
3139 name = err .loc [1 ]
3240 else :
3341 name = err .loc [0 ]
@@ -41,7 +49,7 @@ def parse_error(
4149 else :
4250 if len (err .loc ) == 2 :
4351 name = str (err .loc [0 ])
44- message = f"{ str (err .loc [1 ]).lower ()} : { message } "
52+ # message = f"{str(err.loc[1]).lower()}: {message}"
4553 elif len (err .loc ) == 1 :
4654 name = str (err .loc [0 ])
4755 else :
@@ -50,7 +58,11 @@ def parse_error(
5058 if name in field_names :
5159 return None
5260
53- return {"name" : name , "message" : message .capitalize ()}
61+ return {
62+ "name" : name ,
63+ "message" : message .capitalize (),
64+ "error_code" : error_code ,
65+ }
5466
5567
5668def raw_errors_to_fields (raw_errors : List ) -> List [dict ]:
@@ -60,23 +72,22 @@ def raw_errors_to_fields(raw_errors: List) -> List[dict]:
6072 :param raw_errors: List with instances of raw error
6173 :return: List of dicts (1 dict for every raw error)
6274 """
63- # import pdb;pdb.set_trace()
6475 fields = []
6576 for top_err in raw_errors :
6677 if hasattr (top_err .exc , "raw_errors" ):
6778 for err in top_err .exc .raw_errors :
6879 field_err = parse_error (
6980 err ,
7081 field_names = list (map (lambda x : x ["name" ], fields )),
71- raw = True
82+ raw = True ,
7283 )
7384 if field_err is not None :
7485 fields .append (field_err )
7586 else :
7687 field_err = parse_error (
7788 top_err ,
7889 field_names = list (map (lambda x : x ["name" ], fields )),
79- raw = False
90+ raw = False ,
8091 )
8192 if field_err is not None :
8293 fields .append (field_err )
@@ -98,8 +109,8 @@ async def http_exception_handler(
98109 """
99110 fields = getattr (exc , "fields" , [])
100111 data = {
101- "code " : getattr (exc , "error_code" , exc .status_code ),
102- "detail " : getattr (exc , "message " , exc . detail ),
112+ "error_codes " : [ getattr (exc , "error_code" , exc .status_code )] ,
113+ "message " : getattr (exc , "detail " , "Validation error." ),
103114 "fields" : fields ,
104115 }
105116 return UJSONResponse (data , status_code = exc .status_code )
@@ -118,35 +129,30 @@ async def validation_exception_handler(
118129 :param exc: StarletteHTTPException instance
119130 :return: UJSONResponse with newly formatted error data
120131 """
121- fields = raw_errors_to_fields (exc .raw_errors )
122132 status_code = getattr (exc , "status_code" , 400 )
133+ fields = raw_errors_to_fields (exc .raw_errors )
134+
135+ if fields :
136+ error_codes = set (list (map (lambda x : x ["error_code" ], fields )))
137+ else :
138+ error_codes = [getattr (exc , "error_code" , status_code )]
139+
123140 data = {
124- "code " : getattr ( exc , "error_code" , status_code ) ,
125- "detail " : getattr (exc , "message" , "Validation error" ),
141+ "error_codes " : error_codes ,
142+ "message " : getattr (exc , "message" , "Validation error. " ),
126143 "fields" : fields ,
127144 }
128145 return UJSONResponse (data , status_code = status_code )
129146
130147
131- async def internal_server_error_handler (
132- request : Request , exc : RequestValidationError
133- ) -> UJSONResponse :
134- code = exc .error_code if hasattr (exc , "error_code" ) else 500
135- detail = exc .detail if hasattr (exc , "detail" ) else "Internal Server Error."
136- fields = exc .fields if hasattr (exc , "fields" ) else []
137- status_code = exc .status_code if hasattr (exc , "status_code" ) else 500
138- data = {"code" : code , "detail" : detail , "fields" : fields }
139- return UJSONResponse (data , status_code = status_code )
140-
141-
142148async def not_found_error_handler (
143149 request : Request , exc : RequestValidationError
144150) -> UJSONResponse :
145- code = exc . error_code if hasattr (exc , "error_code" ) else 404
146- detail = exc . detail if hasattr (exc , "detail" ) else "Not found."
147- fields = exc . fields if hasattr (exc , "fields" ) else []
148- status_code = exc . status_code if hasattr (exc , "status_code" ) else 404
149- data = {"code " : code , "detail " : detail , "fields" : fields }
151+ code = getattr (exc , "error_code" , 404 )
152+ detail = getattr (exc , "detail" , "Not found." )
153+ fields = getattr (exc , "fields" , [])
154+ status_code = getattr (exc , "status_code" , 404 )
155+ data = {"error_codes " : [ code ] , "message " : detail , "fields" : fields }
150156 return UJSONResponse (data , status_code = status_code )
151157
152158
@@ -171,4 +177,3 @@ async def startup():
171177 RequestValidationError , validation_exception_handler
172178 )
173179 app .add_exception_handler (404 , not_found_error_handler )
174- app .add_exception_handler (500 , internal_server_error_handler )
0 commit comments