diff --git a/fastapi/_compat.py b/fastapi/_compat.py index 3e0261ae8..6a05684cb 100644 --- a/fastapi/_compat.py +++ b/fastapi/_compat.py @@ -18,14 +18,13 @@ from typing import ( Union, ) +from fastapi.exceptions import RequestErrorModel +from fastapi.types import IncEx, ModelNameMap, UnionType from pydantic import BaseModel, create_model from pydantic.version import VERSION as P_VERSION from starlette.datastructures import UploadFile from typing_extensions import Annotated, Literal, get_args, get_origin -from fastapi.exceptions import RequestErrorModel -from fastapi.types import IncEx, ModelNameMap, UnionType - # Reassign variable to make it reexported for mypy PYDANTIC_VERSION = P_VERSION PYDANTIC_V2 = PYDANTIC_VERSION.startswith("2.") @@ -288,6 +287,7 @@ if PYDANTIC_V2: return BodyModel else: + from fastapi.openapi.constants import REF_PREFIX as REF_PREFIX from pydantic import AnyUrl as Url # noqa: F401 from pydantic import ( # type: ignore[assignment]; noqa: F401 BaseConfig as BaseConfig, @@ -322,15 +322,15 @@ else: from pydantic.fields import ( # type: ignore[no-redef, attr-defined]; noqa: F401 UndefinedType as UndefinedType, ) - from pydantic.schema import field_schema - from pydantic.schema import ( # type: ignore[no-redef] # noqa: F401 - get_annotation_from_field_info as get_annotation_from_field_info, - ) from pydantic.schema import ( + field_schema, get_flat_models_from_fields, get_model_name_map, model_process_schema, ) + from pydantic.schema import ( # type: ignore[no-redef] # noqa: F401 + get_annotation_from_field_info as get_annotation_from_field_info, + ) from pydantic.typing import ( # type: ignore[no-redef]; noqa: F401 evaluate_forwardref as evaluate_forwardref, ) @@ -338,8 +338,6 @@ else: lenient_issubclass as lenient_issubclass, ) - from fastapi.openapi.constants import REF_PREFIX as REF_PREFIX - GetJsonSchemaHandler = Any # type: ignore[assignment,misc] JsonSchemaValue = Dict[str, Any] # type: ignore[misc] CoreSchema = Any # type: ignore[assignment,misc] diff --git a/fastapi/applications.py b/fastapi/applications.py index 63c797f55..b880c6d4f 100644 --- a/fastapi/applications.py +++ b/fastapi/applications.py @@ -13,17 +13,6 @@ from typing import ( Union, ) -from starlette.applications import Starlette -from starlette.datastructures import State -from starlette.exceptions import HTTPException -from starlette.middleware import Middleware -from starlette.middleware.base import BaseHTTPMiddleware -from starlette.requests import Request -from starlette.responses import HTMLResponse, JSONResponse, Response -from starlette.routing import BaseRoute -from starlette.types import ASGIApp, Lifespan, Receive, Scope, Send -from typing_extensions import Annotated, Doc, deprecated - from fastapi import routing from fastapi.datastructures import Default, DefaultPlaceholder from fastapi.exception_handlers import ( @@ -42,6 +31,16 @@ from fastapi.openapi.utils import get_openapi from fastapi.params import Depends from fastapi.types import DecoratedCallable, IncEx from fastapi.utils import generate_unique_id +from starlette.applications import Starlette +from starlette.datastructures import State +from starlette.exceptions import HTTPException +from starlette.middleware import Middleware +from starlette.middleware.base import BaseHTTPMiddleware +from starlette.requests import Request +from starlette.responses import HTMLResponse, JSONResponse, Response +from starlette.routing import BaseRoute +from starlette.types import ASGIApp, Lifespan, Receive, Scope, Send +from typing_extensions import Annotated, Doc, deprecated AppType = TypeVar("AppType", bound="FastAPI") diff --git a/fastapi/routing.py b/fastapi/routing.py index 116eaa88a..7f7f45611 100644 --- a/fastapi/routing.py +++ b/fastapi/routing.py @@ -19,24 +19,6 @@ from typing import ( Union, ) -from pydantic import BaseModel -from starlette import routing -from starlette.concurrency import run_in_threadpool -from starlette.exceptions import HTTPException -from starlette.requests import Request -from starlette.responses import JSONResponse, Response -from starlette.routing import BaseRoute, Match -from starlette.routing import Mount as Mount # noqa -from starlette.routing import ( - compile_path, - get_name, - request_response, - websocket_session, -) -from starlette.types import ASGIApp, Lifespan, Scope -from starlette.websockets import WebSocket -from typing_extensions import Annotated, Doc, deprecated - from fastapi import params from fastapi._compat import ( ModelField, @@ -70,6 +52,24 @@ from fastapi.utils import ( get_value_or_default, is_body_allowed_for_status_code, ) +from pydantic import BaseModel +from starlette import routing +from starlette.concurrency import run_in_threadpool +from starlette.exceptions import HTTPException +from starlette.requests import Request +from starlette.responses import JSONResponse, Response +from starlette.routing import ( + BaseRoute, + Match, + compile_path, + get_name, + request_response, + websocket_session, +) +from starlette.routing import Mount as Mount # noqa +from starlette.types import ASGIApp, Lifespan, Scope +from starlette.websockets import WebSocket +from typing_extensions import Annotated, Doc, deprecated def _prepare_response_content( diff --git a/tests/test_serialize_response_model.py b/tests/test_serialize_response_model.py index ab9d4c6df..8ac3a5f1f 100644 --- a/tests/test_serialize_response_model.py +++ b/tests/test_serialize_response_model.py @@ -1,11 +1,10 @@ from typing import Dict, List, Optional import pytest -from pydantic import BaseModel, Field -from starlette.testclient import TestClient - from fastapi import FastAPI from fastapi._compat import PYDANTIC_V2, PYDANTIC_VERSION +from pydantic import BaseModel, Field +from starlette.testclient import TestClient app = FastAPI() @@ -184,7 +183,9 @@ if PYDANTIC_V2: return { "k1": MultiUseItem(aliased_name="foo"), "k2": MultiUseItem(aliased_name="bar", secret="sEcReT"), - "k3": MultiUseItem(aliased_name="baz", secret="sEcReT", owner_ids=[1, 2, 3]), + "k3": MultiUseItem( + aliased_name="baz", secret="sEcReT", owner_ids=[1, 2, 3] + ), } client_v2 = TestClient(app_v2)