From: Nik Date: Fri, 17 Jan 2020 11:45:55 +0000 (+0300) Subject: :bug: Fix validating form params declared with classes (list, tuple, set, etc) (... X-Git-Tag: 0.47.0~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=874d24181e779ebc6e1c52afb7d6598f863fd6a8;p=thirdparty%2Ffastapi%2Ffastapi.git :bug: Fix validating form params declared with classes (list, tuple, set, etc) (#856) --- diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py index 956fffff47..a1cc0b9808 100644 --- a/fastapi/dependencies/utils.py +++ b/fastapi/dependencies/utils.py @@ -629,9 +629,9 @@ async def request_body_to_args( for field in required_params: value: Any = None if received_body is not None: - if field.shape in sequence_shapes and isinstance( - received_body, FormData - ): + if ( + field.shape in sequence_shapes or field.type_ in sequence_types + ) and isinstance(received_body, FormData): value = received_body.getlist(field.alias) else: value = received_body.get(field.alias) diff --git a/tests/test_forms_from_non_typing_sequences.py b/tests/test_forms_from_non_typing_sequences.py new file mode 100644 index 0000000000..0e47e906ae --- /dev/null +++ b/tests/test_forms_from_non_typing_sequences.py @@ -0,0 +1,46 @@ +from fastapi import FastAPI, Form +from starlette.testclient import TestClient + +app = FastAPI() + + +@app.post("/form/python-list") +def post_form_param_list(items: list = Form(...)): + return items + + +@app.post("/form/python-set") +def post_form_param_set(items: set = Form(...)): + return items + + +@app.post("/form/python-tuple") +def post_form_param_tuple(items: tuple = Form(...)): + return items + + +client = TestClient(app) + + +def test_python_list_param_as_form(): + response = client.post( + "/form/python-list", data={"items": ["first", "second", "third"]} + ) + assert response.status_code == 200 + assert response.json() == ["first", "second", "third"] + + +def test_python_set_param_as_form(): + response = client.post( + "/form/python-set", data={"items": ["first", "second", "third"]} + ) + assert response.status_code == 200 + assert set(response.json()) == {"first", "second", "third"} + + +def test_python_tuple_param_as_form(): + response = client.post( + "/form/python-tuple", data={"items": ["first", "second", "third"]} + ) + assert response.status_code == 200 + assert response.json() == ["first", "second", "third"]