Browse Source

🐛 Fix validating form params declared with classes (list, tuple, set, etc) (#856)

pull/887/head
Nik 5 years ago
committed by Sebastián Ramírez
parent
commit
874d24181e
  1. 6
      fastapi/dependencies/utils.py
  2. 46
      tests/test_forms_from_non_typing_sequences.py

6
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)

46
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"]
Loading…
Cancel
Save