StreamingResponse
and pydantic.BaseModel
?
#2363
-
Previously, my endpoint directly returned a How can I get |
Beta Was this translation helpful? Give feedback.
Answered by
jamesbraza
Dec 8, 2023
Replies: 1 comment
-
Note that #419 is related. You can do something like this ( from collections.abc import AsyncIterable, Iterable
from pydantic import BaseModel
from starlette.background import BackgroundTask
from starlette.concurrency import iterate_in_threadpool
from starlette.responses import JSONResponse, StreamingResponse
class JSONStreamingResponse(StreamingResponse, JSONResponse):
"""StreamingResponse that also render with JSON."""
def __init__(
self,
content: Iterable | AsyncIterable,
status_code: int = 200,
headers: dict[str, str] | None = None,
media_type: str | None = None,
background: BackgroundTask | None = None,
) -> None:
if isinstance(content, AsyncIterable):
self._content_iterable: AsyncIterable = content
else:
self._content_iterable = iterate_in_threadpool(content)
async def body_iterator() -> AsyncIterable[bytes]:
async for content_ in self._content_iterable:
if isinstance(content_, BaseModel):
content_ = content_.model_dump()
yield self.render(content_)
self.body_iterator = body_iterator()
self.status_code = status_code
if media_type is not None:
self.media_type = media_type
self.background = background
self.init_headers(headers) |
Beta Was this translation helpful? Give feedback.
0 replies
Answer selected by
jamesbraza
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Note that #419 is related.
You can do something like this (
pydantic==2.5.2
,starlette==0.27.0
):