From e3c21468cba08f8dcd2c7ca72706d1605dd03ce8 Mon Sep 17 00:00:00 2001 From: Chase Sterling Date: Wed, 6 May 2026 21:49:52 -0400 Subject: [PATCH] Remove datastar_response decorator for FastAPI and document replacement. --- README.md | 3 +++ examples/fastapi/app.py | 16 ++++++---------- src/datastar_py/fastapi.py | 3 +-- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 63d2653..21828e8 100644 --- a/README.md +++ b/README.md @@ -157,6 +157,9 @@ async def my_route(request): await asyncio.sleep(1) ``` +> [!NOTE] +> The `datastar_response` decorator is not needed, (and not provided by the fastapi module,) for FastAPI. Instead, `response_class=DatastarResponse` should be specified in the route decorator to achieve the same result. + ## Signal Helpers The current state of the datastar signals is included by default in every datastar request. A helper is included to load those signals for each diff --git a/examples/fastapi/app.py b/examples/fastapi/app.py index a925025..3d97158 100644 --- a/examples/fastapi/app.py +++ b/examples/fastapi/app.py @@ -13,7 +13,7 @@ import uvicorn from fastapi import FastAPI -from fastapi.responses import HTMLResponse, StreamingResponse +from fastapi.responses import HTMLResponse from datastar_py.fastapi import ( DatastarResponse, @@ -21,7 +21,7 @@ ServerSentEventGenerator, ) -app = FastAPI() +app = FastAPI(debug=True) HTML = """\ @@ -64,7 +64,10 @@ async def read_root(): return HTMLResponse(HTML.replace("CURRENT_TIME", f"{datetime.isoformat(datetime.now())}")) -async def time_updates(): +@app.get("/updates", response_class=DatastarResponse) +async def time_updates(signals: ReadSignals): + # ReadSignals is a dependency that automatically loads the signals from the request + print(signals) while True: yield ServerSentEventGenerator.patch_elements( f"""{datetime.now().isoformat()}""" @@ -76,12 +79,5 @@ async def time_updates(): await asyncio.sleep(1) -@app.get("/updates", response_class=StreamingResponse) -async def updates(signals: ReadSignals): - # ReadSignals is a dependency that automatically loads the signals from the request - print(signals) - return DatastarResponse(time_updates()) - - if __name__ == "__main__": uvicorn.run(app) diff --git a/src/datastar_py/fastapi.py b/src/datastar_py/fastapi.py index 7625b04..8ec104e 100644 --- a/src/datastar_py/fastapi.py +++ b/src/datastar_py/fastapi.py @@ -3,14 +3,13 @@ from fastapi import Depends from .sse import SSE_HEADERS, ServerSentEventGenerator -from .starlette import DatastarResponse, datastar_response, read_signals +from .starlette import DatastarResponse, read_signals __all__ = [ "SSE_HEADERS", "DatastarResponse", "ReadSignals", "ServerSentEventGenerator", - "datastar_response", "read_signals", ]