mirror of https://github.com/tiangolo/fastapi.git
🐛 Fix support for form values with empty strings interpreted as missing (`None` if that's the default), for compatibility with HTML forms (#13537)
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Motov Yurii <109919500+YuriiMotov@users.noreply.github.com> Co-authored-by: Yurii Motov <yurii.motov.monte@gmail.com> Co-authored-by: Sebastián Ramírez <tiangolo@gmail.com>
This commit is contained in:
parent
c3373205d0
commit
d68c066246
|
|
@ -902,8 +902,9 @@ async def _extract_form_body(
|
|||
value = serialize_sequence_value(field=field, value=results)
|
||||
if value is not None:
|
||||
values[field.alias] = value
|
||||
field_aliases = {field.alias for field in body_fields}
|
||||
for key, value in received_body.items():
|
||||
if key not in values:
|
||||
if key not in field_aliases:
|
||||
values[key] = value
|
||||
return values
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,35 @@
|
|||
from typing import Optional
|
||||
|
||||
from fastapi import FastAPI, File, Form
|
||||
from starlette.testclient import TestClient
|
||||
from typing_extensions import Annotated
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
|
||||
@app.post("/urlencoded")
|
||||
async def post_url_encoded(age: Annotated[Optional[int], Form()] = None):
|
||||
return age
|
||||
|
||||
|
||||
@app.post("/multipart")
|
||||
async def post_multi_part(
|
||||
age: Annotated[Optional[int], Form()] = None,
|
||||
file: Annotated[Optional[bytes], File()] = None,
|
||||
):
|
||||
return {"file": file, "age": age}
|
||||
|
||||
|
||||
client = TestClient(app)
|
||||
|
||||
|
||||
def test_form_default_url_encoded():
|
||||
response = client.post("/urlencoded", data={"age": ""})
|
||||
assert response.status_code == 200
|
||||
assert response.text == "null"
|
||||
|
||||
|
||||
def test_form_default_multi_part():
|
||||
response = client.post("/multipart", data={"age": ""})
|
||||
assert response.status_code == 200
|
||||
assert response.json() == {"file": None, "age": None}
|
||||
Loading…
Reference in New Issue