@@ -35,6 +35,26 @@ def __init__(
3535 self .type_initialized = False
3636 self .type_cache : "Union[pydantic.TypeAdapter[Any], None]" = None
3737
38+ def on_validate_error (
39+ self ,
40+ param_info : ParamInfo ,
41+ request : web .Request ,
42+ err : pydantic .ValidationError ,
43+ ) -> Any :
44+ """Method to handle validation errors."""
45+ header_name = self .alias or param_info .name
46+ errors = err .errors (include_url = False )
47+ for error in errors :
48+ error ["loc" ] = (
49+ "header" ,
50+ header_name ,
51+ ) + error ["loc" ]
52+ error .pop ("input" , None ) # type: ignore
53+ raise web .HTTPBadRequest (
54+ headers = {"Content-Type" : "application/json" },
55+ text = json .dumps (errors ),
56+ ) from err
57+
3858 def __call__ (
3959 self ,
4060 param_info : ParamInfo = Depends (),
@@ -75,17 +95,7 @@ def __call__(
7595 try :
7696 return self .type_cache .validate_python (value )
7797 except pydantic .ValidationError as err :
78- errors = err .errors (include_url = False )
79- for error in errors :
80- error ["loc" ] = (
81- "header" ,
82- header_name ,
83- ) + error ["loc" ]
84- error .pop ("input" , None ) # type: ignore
85- raise web .HTTPBadRequest (
86- headers = {"Content-Type" : "application/json" },
87- text = json .dumps (errors ),
88- ) from err
98+ return self .on_validate_error (param_info , request , err )
8999
90100
91101class Json :
@@ -100,6 +110,22 @@ def __init__(self) -> None:
100110 self .type_initialized = False
101111 self .type_cache : "Union[pydantic.TypeAdapter[Any], None]" = None
102112
113+ def on_validate_error (
114+ self ,
115+ param_info : ParamInfo ,
116+ request : web .Request ,
117+ err : pydantic .ValidationError ,
118+ ) -> Any :
119+ """Method to handle validation errors."""
120+ errors = err .errors (include_url = False )
121+ for error in errors :
122+ error ["loc" ] = ("body" ,) + error ["loc" ]
123+ error .pop ("input" , None ) # type: ignore
124+ raise web .HTTPBadRequest (
125+ headers = {"Content-Type" : "application/json" },
126+ text = json .dumps (errors ),
127+ ) from err
128+
103129 async def __call__ (
104130 self ,
105131 param_info : ParamInfo = Depends (),
@@ -135,14 +161,7 @@ async def __call__(
135161 try :
136162 return self .type_cache .validate_python (body )
137163 except pydantic .ValidationError as err :
138- errors = err .errors (include_url = False )
139- for error in errors :
140- error ["loc" ] = ("body" ,) + error ["loc" ]
141- error .pop ("input" , None ) # type: ignore
142- raise web .HTTPBadRequest (
143- headers = {"Content-Type" : "application/json" },
144- text = json .dumps (errors ),
145- ) from err
164+ return self .on_validate_error (param_info , request , err )
146165
147166
148167class Query :
@@ -173,6 +192,26 @@ def __init__(
173192 self .type_initialized = False
174193 self .type_cache : "Union[pydantic.TypeAdapter[Any], None]" = None
175194
195+ def on_validate_error (
196+ self ,
197+ param_info : ParamInfo ,
198+ request : web .Request ,
199+ err : pydantic .ValidationError ,
200+ ) -> Any :
201+ """Method to handle validation errors."""
202+ param_name = self .alias or param_info .name
203+ errors = err .errors (include_url = False )
204+ for error in errors :
205+ error ["loc" ] = (
206+ "query" ,
207+ param_name ,
208+ ) + error ["loc" ]
209+ error .pop ("input" , None ) # type: ignore
210+ raise web .HTTPBadRequest (
211+ headers = {"Content-Type" : "application/json" },
212+ text = json .dumps (errors ),
213+ ) from err
214+
176215 def __call__ (
177216 self ,
178217 param_info : ParamInfo = Depends (),
@@ -213,17 +252,7 @@ def __call__(
213252 try :
214253 return self .type_cache .validate_python (value )
215254 except pydantic .ValidationError as err :
216- errors = err .errors (include_url = False )
217- for error in errors :
218- error ["loc" ] = (
219- "query" ,
220- param_name ,
221- ) + error ["loc" ]
222- error .pop ("input" , None ) # type: ignore
223- raise web .HTTPBadRequest (
224- headers = {"Content-Type" : "application/json" },
225- text = json .dumps (errors ),
226- ) from err
255+ return self .on_validate_error (param_info , request , err )
227256
228257
229258class Form :
@@ -240,6 +269,22 @@ def __init__(self) -> None:
240269 self .type_initialized = False
241270 self .type_cache : "Union[pydantic.TypeAdapter[Any], None]" = None
242271
272+ def on_validate_error (
273+ self ,
274+ param_info : ParamInfo ,
275+ request : web .Request ,
276+ err : pydantic .ValidationError ,
277+ ) -> Any :
278+ """Method to handle validation errors."""
279+ errors = err .errors (include_url = False )
280+ for error in errors :
281+ error .pop ("input" , None ) # type: ignore
282+ error ["loc" ] = ("form" ,) + error ["loc" ]
283+ raise web .HTTPBadRequest (
284+ headers = {"Content-Type" : "application/json" },
285+ text = json .dumps (errors ),
286+ ) from err
287+
243288 async def __call__ (
244289 self ,
245290 param_info : ParamInfo = Depends (),
@@ -272,14 +317,7 @@ async def __call__(
272317 try :
273318 return self .type_cache .validate_python (form_data )
274319 except pydantic .ValidationError as err :
275- errors = err .errors (include_url = False )
276- for error in errors :
277- error .pop ("input" , None ) # type: ignore
278- error ["loc" ] = ("form" ,) + error ["loc" ]
279- raise web .HTTPBadRequest (
280- headers = {"Content-Type" : "application/json" },
281- text = json .dumps (errors ),
282- ) from err
320+ return self .on_validate_error (param_info , request , err )
283321
284322
285323class Path :
@@ -304,6 +342,22 @@ def __init__(
304342 self .type_initialized = False
305343 self .type_cache : "Union[pydantic.TypeAdapter[Any], None]" = None
306344
345+ def on_validate_error (
346+ self ,
347+ param_info : ParamInfo ,
348+ request : web .Request ,
349+ err : pydantic .ValidationError ,
350+ ) -> Any :
351+ """Method to handle validation errors."""
352+ errors = err .errors (include_url = False )
353+ for error in errors :
354+ error .pop ("input" , None ) # type: ignore
355+ error ["loc" ] = ("path" ,) + error ["loc" ]
356+ raise web .HTTPBadRequest (
357+ headers = {"Content-Type" : "application/json" },
358+ text = json .dumps (errors ),
359+ ) from err
360+
307361 def __call__ (
308362 self ,
309363 param_info : ParamInfo = Depends (),
@@ -336,14 +390,7 @@ def __call__(
336390 try :
337391 return self .type_cache .validate_python (matched_data )
338392 except pydantic .ValidationError as err :
339- errors = err .errors (include_url = False )
340- for error in errors :
341- error .pop ("input" , None ) # type: ignore
342- error ["loc" ] = ("path" ,) + error ["loc" ]
343- raise web .HTTPBadRequest (
344- headers = {"Content-Type" : "application/json" },
345- text = json .dumps (errors ),
346- ) from err
393+ return self .on_validate_error (param_info , request , err )
347394
348395
349396class ExtraOpenAPI :
@@ -375,6 +422,6 @@ def __call__(self) -> None:
375422 """
376423 This method is called when dependency is resolved.
377424
378- It's empty, becuase it's used by the swagger function and
425+ It's empty, becuase it's used only by the `setup_swagger` function and
379426 there is no actual dependency.
380427 """
0 commit comments