Skip to content

Commit 2f33e85

Browse files
luolingchunluolingchun
andauthored
Fix populate_by_name when execute model_validate (#167)
* Fix `populate_by_name` when execute `model_validate` * Fix mypy --------- Co-authored-by: luolingchun <luolingchun@outloook.com>
1 parent 677ff02 commit 2f33e85

File tree

1 file changed

+25
-36
lines changed

1 file changed

+25
-36
lines changed

flask_openapi3/request.py

Lines changed: 25 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,21 @@
33
# @Time : 2022/4/1 16:54
44
import json
55
from 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

88
from flask import request, current_app, abort
99
from pydantic import ValidationError, BaseModel
1010

11+
from .models import FileStorage
12+
1113

1214
def _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):
3133
def _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

Comments
 (0)