Skip to content

Commit 740f7ca

Browse files
authored
Merge branch 'master' into bugfix/missing-parse-rule
2 parents 09e57b8 + 4e7c306 commit 740f7ca

File tree

2 files changed

+94
-23
lines changed

2 files changed

+94
-23
lines changed

flask_restx/reqparse.py

+12-3
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,10 @@ def __init__(
106106
required=False,
107107
ignore=False,
108108
type=text_type,
109-
location=("json", "values",),
109+
location=(
110+
"json",
111+
"values",
112+
),
110113
choices=(),
111114
action="store",
112115
help=None,
@@ -138,15 +141,21 @@ def source(self, request):
138141
:param request: The flask request object to parse arguments from
139142
"""
140143
if isinstance(self.location, six.string_types):
141-
value = getattr(request, self.location, MultiDict())
144+
if self.location in {"json", "get_json"}:
145+
value = request.get_json(silent=True)
146+
else:
147+
value = getattr(request, self.location, MultiDict())
142148
if callable(value):
143149
value = value()
144150
if value is not None:
145151
return value
146152
else:
147153
values = MultiDict()
148154
for l in self.location:
149-
value = getattr(request, l, None)
155+
if l in {"json", "get_json"}:
156+
value = request.get_json(silent=True)
157+
else:
158+
value = getattr(request, l, None)
150159
if callable(value):
151160
value = value()
152161
if value is not None:

tests/test_reqparse.py

+82-20
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,9 @@ def test_help(self, app, mocker):
4141
)
4242
parser = RequestParser()
4343
parser.add_argument("foo", choices=("one", "two"), help="Bad choice.")
44-
req = mocker.Mock(["values"])
44+
req = mocker.Mock(["values", "get_json"])
4545
req.values = MultiDict([("foo", "three")])
46+
req.get_json.return_value = None
4647
with pytest.raises(BadRequest):
4748
parser.parse_args(req)
4849
expected = {
@@ -58,7 +59,8 @@ def test_no_help(self, app, mocker):
5859
)
5960
parser = RequestParser()
6061
parser.add_argument("foo", choices=["one", "two"])
61-
req = mocker.Mock(["values"])
62+
req = mocker.Mock(["values", "get_json"])
63+
req.get_json.return_value = None
6264
req.values = MultiDict([("foo", "three")])
6365
with pytest.raises(BadRequest):
6466
parser.parse_args(req)
@@ -76,9 +78,9 @@ def test_viewargs(self, mocker):
7678
args = parser.parse_args(req)
7779
assert args["foo"] == "bar"
7880

79-
req = mocker.Mock()
81+
req = mocker.Mock(["get_json"])
8082
req.values = ()
81-
req.json = None
83+
req.get_json.return_value = None
8284
req.view_args = {"foo": "bar"}
8385
parser = RequestParser()
8486
parser.add_argument("foo", store_missing=True)
@@ -101,11 +103,12 @@ def test_parse_unicode_app(self, app):
101103
args = parser.parse_args()
102104
assert args["foo"] == "barß"
103105

104-
@pytest.mark.request_context("/bubble", method="post")
106+
@pytest.mark.request_context(
107+
"/bubble", method="post", content_type="application/json"
108+
)
105109
def test_json_location(self):
106110
parser = RequestParser()
107111
parser.add_argument("foo", location="json", store_missing=True)
108-
109112
args = parser.parse_args()
110113
assert args["foo"] is None
111114

@@ -856,7 +859,8 @@ def test_source_bad_location(self, mocker):
856859
assert len(arg.source(req)) == 0 # yes, basically you don't find it
857860

858861
def test_source_default_location(self, mocker):
859-
req = mocker.Mock(["values"])
862+
req = mocker.Mock(["values", "get_json"])
863+
req.get_json.return_value = None
860864
req._get_child_mock = lambda **kwargs: MultiDict()
861865
arg = Argument("foo")
862866
assert arg.source(req) == req.values
@@ -910,28 +914,47 @@ def test_unknown_type(self):
910914
parser = RequestParser()
911915
parser.add_argument("unknown", type=lambda v: v)
912916
assert parser.__schema__ == [
913-
{"name": "unknown", "type": "string", "in": "query",}
917+
{
918+
"name": "unknown",
919+
"type": "string",
920+
"in": "query",
921+
}
914922
]
915923

916924
def test_required(self):
917925
parser = RequestParser()
918926
parser.add_argument("int", type=int, required=True)
919927
assert parser.__schema__ == [
920-
{"name": "int", "type": "integer", "in": "query", "required": True,}
928+
{
929+
"name": "int",
930+
"type": "integer",
931+
"in": "query",
932+
"required": True,
933+
}
921934
]
922935

923936
def test_default(self):
924937
parser = RequestParser()
925938
parser.add_argument("int", type=int, default=5)
926939
assert parser.__schema__ == [
927-
{"name": "int", "type": "integer", "in": "query", "default": 5,}
940+
{
941+
"name": "int",
942+
"type": "integer",
943+
"in": "query",
944+
"default": 5,
945+
}
928946
]
929947

930948
def test_default_as_false(self):
931949
parser = RequestParser()
932950
parser.add_argument("bool", type=inputs.boolean, default=False)
933951
assert parser.__schema__ == [
934-
{"name": "bool", "type": "boolean", "in": "query", "default": False,}
952+
{
953+
"name": "bool",
954+
"type": "boolean",
955+
"in": "query",
956+
"default": False,
957+
}
935958
]
936959

937960
def test_choices(self):
@@ -954,31 +977,59 @@ def test_location(self):
954977
parser.add_argument("in_headers", type=int, location="headers")
955978
parser.add_argument("in_cookie", type=int, location="cookie")
956979
assert parser.__schema__ == [
957-
{"name": "default", "type": "integer", "in": "query",},
958-
{"name": "in_values", "type": "integer", "in": "query",},
959-
{"name": "in_query", "type": "integer", "in": "query",},
960-
{"name": "in_headers", "type": "integer", "in": "header",},
980+
{
981+
"name": "default",
982+
"type": "integer",
983+
"in": "query",
984+
},
985+
{
986+
"name": "in_values",
987+
"type": "integer",
988+
"in": "query",
989+
},
990+
{
991+
"name": "in_query",
992+
"type": "integer",
993+
"in": "query",
994+
},
995+
{
996+
"name": "in_headers",
997+
"type": "integer",
998+
"in": "header",
999+
},
9611000
]
9621001

9631002
def test_location_json(self):
9641003
parser = RequestParser()
9651004
parser.add_argument("in_json", type=str, location="json")
9661005
assert parser.__schema__ == [
967-
{"name": "in_json", "type": "string", "in": "body",}
1006+
{
1007+
"name": "in_json",
1008+
"type": "string",
1009+
"in": "body",
1010+
}
9681011
]
9691012

9701013
def test_location_form(self):
9711014
parser = RequestParser()
9721015
parser.add_argument("in_form", type=int, location="form")
9731016
assert parser.__schema__ == [
974-
{"name": "in_form", "type": "integer", "in": "formData",}
1017+
{
1018+
"name": "in_form",
1019+
"type": "integer",
1020+
"in": "formData",
1021+
}
9751022
]
9761023

9771024
def test_location_files(self):
9781025
parser = RequestParser()
9791026
parser.add_argument("in_files", type=FileStorage, location="files")
9801027
assert parser.__schema__ == [
981-
{"name": "in_files", "type": "file", "in": "formData",}
1028+
{
1029+
"name": "in_files",
1030+
"type": "file",
1031+
"in": "formData",
1032+
}
9821033
]
9831034

9841035
def test_form_and_body_location(self):
@@ -1008,7 +1059,13 @@ def test_models(self):
10081059
)
10091060
parser = RequestParser()
10101061
parser.add_argument("todo", type=todo_fields)
1011-
assert parser.__schema__ == [{"name": "todo", "type": "Todo", "in": "body",}]
1062+
assert parser.__schema__ == [
1063+
{
1064+
"name": "todo",
1065+
"type": "Todo",
1066+
"in": "body",
1067+
}
1068+
]
10121069

10131070
def test_lists(self):
10141071
parser = RequestParser()
@@ -1061,5 +1118,10 @@ def test_callable_default(self):
10611118
parser = RequestParser()
10621119
parser.add_argument("int", type=int, default=lambda: 5)
10631120
assert parser.__schema__ == [
1064-
{"name": "int", "type": "integer", "in": "query", "default": 5,}
1121+
{
1122+
"name": "int",
1123+
"type": "integer",
1124+
"in": "query",
1125+
"default": 5,
1126+
}
10651127
]

0 commit comments

Comments
 (0)