]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
:bug: Fix body parsing (#918)
authorDavid Montague <35119617+dmontagu@users.noreply.github.com>
Tue, 4 Feb 2020 04:01:59 +0000 (20:01 -0800)
committerGitHub <noreply@github.com>
Tue, 4 Feb 2020 04:01:59 +0000 (05:01 +0100)
fastapi/dependencies/utils.py
tests/test_tutorial/test_body_multiple_params/test_tutorial003.py

index a1cc0b9808d4cd15844aabada18454b4ae0b9843..33130a90ef33959872528e1d1dc791dcfa72af5a 100644 (file)
@@ -634,7 +634,11 @@ async def request_body_to_args(
                 ) and isinstance(received_body, FormData):
                     value = received_body.getlist(field.alias)
                 else:
-                    value = received_body.get(field.alias)
+                    try:
+                        value = received_body.get(field.alias)
+                    except AttributeError:
+                        errors.append(get_missing_field_error(field.alias))
+                        continue
             if (
                 value is None
                 or (isinstance(field_info, params.Form) and value == "")
@@ -645,18 +649,7 @@ async def request_body_to_args(
                 )
             ):
                 if field.required:
-                    if PYDANTIC_1:
-                        errors.append(
-                            ErrorWrapper(MissingError(), loc=("body", field.alias))
-                        )
-                    else:  # pragma: nocover
-                        errors.append(
-                            ErrorWrapper(  # type: ignore
-                                MissingError(),
-                                loc=("body", field.alias),
-                                config=BaseConfig,
-                            )
-                        )
+                    errors.append(get_missing_field_error(field.alias))
                 else:
                     values[field.name] = deepcopy(field.default)
                 continue
@@ -685,6 +678,16 @@ async def request_body_to_args(
     return values, errors
 
 
+def get_missing_field_error(field_alias: str) -> ErrorWrapper:
+    if PYDANTIC_1:
+        missing_field_error = ErrorWrapper(MissingError(), loc=("body", field_alias))
+    else:  # pragma: no cover
+        missing_field_error = ErrorWrapper(  # type: ignore
+            MissingError(), loc=("body", field_alias), config=BaseConfig,
+        )
+    return missing_field_error
+
+
 def get_schema_compatible_field(*, field: ModelField) -> ModelField:
     out_field = field
     if lenient_issubclass(field.type_, UploadFile):
index 54bf193e9a613c177550e6c350d9ae14c9359a4f..7dcf9edd846a5eae9cfeb6f3fda210cc67785a27 100644 (file)
@@ -166,6 +166,30 @@ def test_openapi_schema():
                 ]
             },
         ),
+        (
+            "/items/5",
+            [],
+            422,
+            {
+                "detail": [
+                    {
+                        "loc": ["body", "item"],
+                        "msg": "field required",
+                        "type": "value_error.missing",
+                    },
+                    {
+                        "loc": ["body", "user"],
+                        "msg": "field required",
+                        "type": "value_error.missing",
+                    },
+                    {
+                        "loc": ["body", "importance"],
+                        "msg": "field required",
+                        "type": "value_error.missing",
+                    },
+                ]
+            },
+        ),
     ],
 )
 def test_post_body(path, body, expected_status, expected_response):