Browse Source

Fix mediatype for `Form` model with `File` field

pull/14343/head
Yurii Motov 8 months ago
parent
commit
1be664f52f
  1. 13
      fastapi/openapi/utils.py

13
fastapi/openapi/utils.py

@ -8,6 +8,7 @@ from fastapi._compat import (
JsonSchemaValue, JsonSchemaValue,
ModelField, ModelField,
Undefined, Undefined,
get_cached_model_fields,
get_compat_model_name_map, get_compat_model_name_map,
get_definitions, get_definitions,
get_schema_from_model_field, get_schema_from_model_field,
@ -23,7 +24,7 @@ from fastapi.dependencies.utils import (
from fastapi.encoders import jsonable_encoder from fastapi.encoders import jsonable_encoder
from fastapi.openapi.constants import METHODS_WITH_BODY, REF_PREFIX from fastapi.openapi.constants import METHODS_WITH_BODY, REF_PREFIX
from fastapi.openapi.models import OpenAPI from fastapi.openapi.models import OpenAPI
from fastapi.params import Body, ParamTypes from fastapi.params import Body, File, Form, ParamTypes
from fastapi.responses import Response from fastapi.responses import Response
from fastapi.types import ModelNameMap from fastapi.types import ModelNameMap
from fastapi.utils import ( from fastapi.utils import (
@ -185,6 +186,16 @@ def get_openapi_operation_request_body(
) )
field_info = cast(Body, body_field.field_info) field_info = cast(Body, body_field.field_info)
request_media_type = field_info.media_type request_media_type = field_info.media_type
if (
isinstance(field_info, Form)
and request_media_type == "application/x-www-form-urlencoded"
and lenient_issubclass(body_field.type_, BaseModel)
): # Enforce multipart/form-data media type for Form models with File fields
form_model_fields = get_cached_model_fields(body_field.type_)
if any(
isinstance(form_field.field_info, File) for form_field in form_model_fields
):
request_media_type = "multipart/form-data"
required = body_field.required required = body_field.required
request_body_oai: Dict[str, Any] = {} request_body_oai: Dict[str, Any] = {}
if required: if required:

Loading…
Cancel
Save