diff --git a/fastapi/applications.py b/fastapi/applications.py index 05c7bd2be..b8c46ca48 100644 --- a/fastapi/applications.py +++ b/fastapi/applications.py @@ -27,6 +27,7 @@ from fastapi.openapi.docs import ( get_swagger_ui_html, get_swagger_ui_oauth2_redirect_html, ) +from fastapi.openapi.models import Server from fastapi.openapi.utils import get_openapi from fastapi.params import Depends from fastapi.types import DecoratedCallable, IncEx @@ -286,7 +287,7 @@ class FastAPI(Starlette): ), ] = None, servers: Annotated[ - Optional[List[Dict[str, Union[str, Any]]]], + Optional[List[Union[Dict[str, Union[str, Any]], Server]]], Doc( """ A `list` of `dict`s with connectivity information to a target server. @@ -997,7 +998,7 @@ class FastAPI(Starlette): def setup(self) -> None: if self.openapi_url: - urls = (server_data.get("url") for server_data in self.servers) + urls = (dict(server_data).get("url") for server_data in self.servers) server_urls = {url for url in urls if url} async def openapi(req: Request) -> JSONResponse: diff --git a/fastapi/openapi/utils.py b/fastapi/openapi/utils.py index 808646cc2..c1115c30a 100644 --- a/fastapi/openapi/utils.py +++ b/fastapi/openapi/utils.py @@ -23,7 +23,7 @@ from fastapi.dependencies.utils import ( ) from fastapi.encoders import jsonable_encoder from fastapi.openapi.constants import METHODS_WITH_BODY, REF_PREFIX, REF_TEMPLATE -from fastapi.openapi.models import OpenAPI +from fastapi.openapi.models import OpenAPI, Server from fastapi.params import Body, ParamTypes from fastapi.responses import Response from fastapi.types import ModelNameMap @@ -484,7 +484,7 @@ def get_openapi( routes: Sequence[BaseRoute], webhooks: Optional[Sequence[BaseRoute]] = None, tags: Optional[List[Dict[str, Any]]] = None, - servers: Optional[List[Dict[str, Union[str, Any]]]] = None, + servers: Optional[List[Union[Dict[str, Union[str, Any]], Server]]] = None, terms_of_service: Optional[str] = None, contact: Optional[Dict[str, Union[str, Any]]] = None, license_info: Optional[Dict[str, Union[str, Any]]] = None, diff --git a/tests/test_openapi_servers.py b/tests/test_openapi_servers.py index 8697c8438..cebb2f203 100644 --- a/tests/test_openapi_servers.py +++ b/tests/test_openapi_servers.py @@ -1,14 +1,15 @@ from dirty_equals import IsOneOf from fastapi import FastAPI +from fastapi.openapi.models import Server from fastapi.testclient import TestClient app = FastAPI( servers=[ {"url": "/", "description": "Default, relative server"}, - { - "url": "http://staging.localhost.tiangolo.com:8000", - "description": "Staging but actually localhost still", - }, + Server( + url="http://staging.localhost.tiangolo.com:8000", + description="Staging but actually localhost still", + ), {"url": "https://prod.example.com"}, ] )