from fastapi import FastAPI from fastapi.openapi.docs import get_redoc_html def add_redoc_endpoint( app: FastAPI, *, redoc_url: str | None, openapi_url: str | None, title: str | None, ) -> None: """Attach a ReDoc endpoint if docs are enabled. The default FastAPI ReDoc handler sometimes renders a blank page when the CDN bundle fails to load. By explicitly registering the handler and pinning the bundle version, we ensure the endpoint always returns a fully rendered page. """ if not redoc_url or not openapi_url: return for route in app.router.routes: if getattr(route, "path", None) == redoc_url: return @app.get(redoc_url, include_in_schema=False) async def redoc_html(): # pragma: no cover - template rendering return get_redoc_html( openapi_url=openapi_url, title=f"{title or app.title} - ReDoc", redoc_js_url="https://cdn.jsdelivr.net/npm/redoc@2.1.5/bundles/redoc.standalone.js", )