]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
:bug: Fix constrained bytes, from defaults in Pydantic
authorSebastián Ramírez <tiangolo@gmail.com>
Sat, 5 Jan 2019 13:30:27 +0000 (17:30 +0400)
committerSebastián Ramírez <tiangolo@gmail.com>
Sat, 5 Jan 2019 13:30:27 +0000 (17:30 +0400)
 #2

fastapi/dependencies/utils.py
fastapi/routing.py
fastapi/utils.py
tests/test_tutorial/test_request_files/test_tutorial001.py

index 7dddae3c293e4bd2739229fae5f4fc9f5760e1e3..2dce12bf1f94bea61ee99c0508574e87d409fd16 100644 (file)
@@ -9,8 +9,8 @@ from uuid import UUID
 from fastapi import params
 from fastapi.dependencies.models import Dependant, SecurityRequirement
 from fastapi.security.base import SecurityBase
-from fastapi.utils import get_path_param_names
-from pydantic import BaseConfig, Schema, create_model
+from fastapi.utils import UnconstrainedConfig, get_path_param_names
+from pydantic import Schema, create_model
 from pydantic.error_wrappers import ErrorWrapper
 from pydantic.errors import MissingError
 from pydantic.fields import Field, Required, Shape
@@ -163,7 +163,7 @@ def add_param_to_fields(
         default=None if required else default_value,
         alias=alias,
         required=required,
-        model_config=BaseConfig(),
+        model_config=UnconstrainedConfig,
         class_validators=[],
         schema=schema,
     )
@@ -197,7 +197,7 @@ def add_param_to_body_fields(*, param: inspect.Parameter, dependant: Dependant)
         default=None if required else default_value,
         alias=schema.alias or param.name,
         required=required,
-        model_config=BaseConfig,
+        model_config=UnconstrainedConfig,
         class_validators=[],
         schema=schema,
     )
@@ -281,7 +281,7 @@ def request_params_to_args(
                     ErrorWrapper(
                         MissingError(),
                         loc=(schema.in_.value, field.alias),
-                        config=BaseConfig,
+                        config=UnconstrainedConfig,
                     )
                 )
             else:
@@ -315,7 +315,9 @@ async def request_body_to_args(
                 if field.required:
                     errors.append(
                         ErrorWrapper(
-                            MissingError(), loc=("body", field.alias), config=BaseConfig
+                            MissingError(),
+                            loc=("body", field.alias),
+                            config=UnconstrainedConfig,
                         )
                     )
                 else:
@@ -356,7 +358,7 @@ def get_body_field(*, dependant: Dependant, name: str) -> Field:
         type_=BodyModel,
         default=None,
         required=required,
-        model_config=BaseConfig,
+        model_config=UnconstrainedConfig,
         class_validators=[],
         alias="body",
         schema=BodySchema(None),
index 254f8f999b8b893a50638c12ce947b49f6134ae9..0c9334ba59cce8338dfe2f27f9061eac88cb1b75 100644 (file)
@@ -7,7 +7,8 @@ from fastapi import params
 from fastapi.dependencies.models import Dependant
 from fastapi.dependencies.utils import get_body_field, get_dependant, solve_dependencies
 from fastapi.encoders import jsonable_encoder
-from pydantic import BaseConfig, BaseModel, Schema
+from fastapi.utils import UnconstrainedConfig
+from pydantic import BaseModel, Schema
 from pydantic.error_wrappers import ErrorWrapper, ValidationError
 from pydantic.fields import Field
 from pydantic.utils import lenient_issubclass
@@ -130,7 +131,7 @@ class APIRoute(routing.Route):
                 class_validators=[],
                 default=None,
                 required=False,
-                model_config=BaseConfig(),
+                model_config=UnconstrainedConfig,
                 schema=Schema(None),
             )
         else:
index f3b4df82e8887ba92893f859b64c180214cd48d6..395ec9f5bcf907b47abe32c50e09c33534856aaf 100644 (file)
@@ -3,12 +3,17 @@ from typing import Any, Dict, List, Sequence, Set, Type
 
 from fastapi import routing
 from fastapi.openapi.constants import REF_PREFIX
-from pydantic import BaseModel
+from pydantic import BaseConfig, BaseModel
 from pydantic.fields import Field
 from pydantic.schema import get_flat_models_from_fields, model_process_schema
 from starlette.routing import BaseRoute
 
 
+class UnconstrainedConfig(BaseConfig):
+    min_anystr_length = None
+    max_anystr_length = None
+
+
 def get_flat_models_from_routes(
     routes: Sequence[Type[BaseRoute]]
 ) -> Set[Type[BaseModel]]:
index d92d5a749f2e9b80bf30519d2ed928e305a941b7..84de46e0ad806208abf9cf464ea06d75ec79391d 100644 (file)
@@ -119,3 +119,15 @@ def test_post_file(tmpdir):
     response = client.post("/files/", files={"file": open(path, "rb")})
     assert response.status_code == 200
     assert response.json() == {"file_size": 14}
+
+
+def test_post_large_file(tmpdir):
+    default_pydantic_max_size = 2 ** 16
+    path = os.path.join(tmpdir, "test.txt")
+    with open(path, "wb") as file:
+        file.write(b"x" * (default_pydantic_max_size + 1))
+
+    client = TestClient(app)
+    response = client.post("/files/", files={"file": open(path, "rb")})
+    assert response.status_code == 200
+    assert response.json() == {"file_size": default_pydantic_max_size + 1}