Browse Source

fix: preserve empty form values for required params

pull/15904/head
Precious Nwakama 3 weeks ago
parent
commit
e831572c2d
  1. 24
      fastapi/dependencies/utils.py
  2. 11
      tests/test_form_default.py

24
fastapi/dependencies/utils.py

@ -762,22 +762,24 @@ def _get_multidict_value(
value = values.getlist(alias) value = values.getlist(alias)
else: else:
value = values.get(alias, None) value = values.get(alias, None)
if ( if value is None or (
value is None field_annotation_is_sequence(field.field_info.annotation)
or ( and len(value) == 0
isinstance(field.field_info, params.Form)
and isinstance(value, str) # For type checks
and value == ""
)
or (
field_annotation_is_sequence(field.field_info.annotation)
and len(value) == 0
)
): ):
if field.field_info.is_required(): if field.field_info.is_required():
return return
else: else:
return deepcopy(field.default) return deepcopy(field.default)
if (
isinstance(field.field_info, params.Form)
and isinstance(value, str) # For type checks
and value == ""
):
if field.field_info.is_required():
return value
else:
return deepcopy(field.default)
return value return value

11
tests/test_form_default.py

@ -19,6 +19,11 @@ async def post_multi_part(
return {"file": file, "age": age} return {"file": file, "age": age}
@app.post("/urlencoded-required")
async def post_url_encoded_required(name: Annotated[str, Form()]):
return name
client = TestClient(app) client = TestClient(app)
@ -32,3 +37,9 @@ def test_form_default_multi_part():
response = client.post("/multipart", data={"age": ""}) response = client.post("/multipart", data={"age": ""})
assert response.status_code == 200 assert response.status_code == 200
assert response.json() == {"file": None, "age": None} assert response.json() == {"file": None, "age": None}
def test_required_form_field_with_empty_string():
response = client.post("/urlencoded-required", data={"name": ""})
assert response.status_code == 200
assert response.text == ""

Loading…
Cancel
Save