33# @Time : 2022/4/1 16:54
44import json
55from json import JSONDecodeError
6- from typing import Any , Type , Optional , Dict , Union
6+ from typing import Any , Type , Optional , Dict , get_origin , get_args
77
88from flask import request , current_app , abort
99from pydantic import ValidationError , BaseModel
1010
11+ from .models import FileStorage
12+
1113
1214def _validate_header (header : Type [BaseModel ], func_kwargs ):
1315 request_headers = dict (request .headers )
14- for key , value in header .model_json_schema (). get ( "properties" , {}) .items ():
16+ for key , value in header .model_fields .items ():
1517 key_title = key .replace ("_" , "-" ).title ()
1618 # Add original key
1719 if key_title in request_headers .keys ():
18- request_headers [key ] = request_headers [key_title ]
20+ request_headers [value . alias or key ] = request_headers [key_title ]
1921 func_kwargs .update ({"header" : header .model_validate (obj = request_headers )})
2022
2123
@@ -31,12 +33,11 @@ def _validate_path(path: Type[BaseModel], path_kwargs, func_kwargs):
3133def _validate_query (query : Type [BaseModel ], func_kwargs ):
3234 request_args = request .args
3335 query_dict = {}
34- for k , v in query .model_json_schema ().get ("properties" , {}).items ():
35- value : Union [list , Optional [str ]]
36- if v .get ("type" ) == "array" :
37- value = request_args .getlist (k )
36+ for k , v in query .model_fields .items ():
37+ if get_origin (v .annotation ) is list :
38+ value = request_args .getlist (v .alias or k )
3839 else :
39- value = request_args .get (k )
40+ value = request_args .get (v . alias or k ) # type:ignore
4041 if value is not None :
4142 query_dict [k ] = value
4243 func_kwargs .update ({"query" : query .model_validate (obj = query_dict )})
@@ -46,37 +47,25 @@ def _validate_form(form: Type[BaseModel], func_kwargs):
4647 request_form = request .form
4748 request_files = request .files
4849 form_dict = {}
49- for k , v in form .model_json_schema ().get ("properties" , {}).items ():
50- if v .get ("type" ) == "array" :
51- items = v .get ("items" , {})
52- if items .get ("type" ) == "string" and items .get ("format" ) == "binary" :
53- # List[FileStorage]
54- value = request_files .getlist (k )
55- elif items .get ("type" ) in ["object" , "null" , None ]:
56- # list object, None, $ref, anyOf
50+ for k , v in form .model_fields .items ():
51+ if get_origin (v .annotation ) is list :
52+ if get_args (v .annotation )[0 ] is FileStorage :
53+ value = request_files .getlist (v .alias or k )
54+ else :
5755 value = []
58- for i in request_form .getlist (k ):
56+ for i in request_form .getlist (v . alias or k ):
5957 try :
60- json_loads_result = json .loads (i )
61- except JSONDecodeError :
62- json_loads_result = i
63- value .append (json_loads_result )
64- else :
65- # List[str], List[int] ...
66- value = request_form .getlist (k ) # type:ignore
67- elif v .get ("type" ) in ["object" , "null" , None ]:
68- # list object, None, $ref, anyOf
69- try :
70- value = json .loads (request_form .get (k )) if request_form .get (k ) else None # type:ignore
71- except JSONDecodeError :
72- value = request_form .get (k ) # type:ignore
58+ value .append (json .loads (i ))
59+ except (JSONDecodeError , TypeError ):
60+ value .append (i ) # type:ignore
61+ elif v .annotation is FileStorage :
62+ value = request_files .get (v .alias or k ) # type:ignore
7363 else :
74- if v .get ("format" ) == "binary" :
75- # FileStorage
76- value = request_files .get (k ) # type:ignore
77- else :
78- # str, int ...
79- value = request_form .get (k ) # type:ignore
64+ _value = request_form .get (v .alias or k )
65+ try :
66+ value = json .loads (_value ) # type:ignore
67+ except (JSONDecodeError , TypeError ):
68+ value = _value # type:ignore
8069 if value is not None :
8170 form_dict [k ] = value
8271 func_kwargs .update ({"form" : form .model_validate (obj = form_dict )})
0 commit comments