Skip to content

Commit b474020

Browse files
committed
Add read_signals helpers to the python SDK
1 parent 10b2984 commit b474020

File tree

6 files changed

+46
-5
lines changed

6 files changed

+46
-5
lines changed

sdk/python/src/datastar_py/django.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
import json
12
from functools import wraps
3+
from typing import Any
24

3-
from django.http import StreamingHttpResponse as _StreamingHttpResponse
5+
from django.http import StreamingHttpResponse as _StreamingHttpResponse, HttpRequest
46

57
from .sse import SSE_HEADERS, ServerSentEventGenerator
68

@@ -10,3 +12,9 @@ class DatastarStreamingHttpResponse(_StreamingHttpResponse, ServerSentEventGener
1012
def __init__(self, *args, **kwargs):
1113
kwargs["headers"] = {**SSE_HEADERS, **kwargs.get("headers", {})}
1214
super().__init__(*args, **kwargs)
15+
16+
def read_signals(request: HttpRequest) -> dict[str, Any]:
17+
if request.method == "GET":
18+
return json.loads(request.GET.get("datastar"))
19+
else:
20+
return json.loads(request.body)

sdk/python/src/datastar_py/fastapi.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,7 @@
1-
from .starlette import DatastarStreamingResponse, ServerSentEventGenerator
1+
from typing import Annotated, Any
2+
3+
from fastapi import Depends
4+
from .starlette import DatastarStreamingResponse, ServerSentEventGenerator, read_signals
5+
6+
7+
SignalsDep = Annotated[dict[str, Any], Depends(read_signals)]
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
from .sse import ServerSentEventGenerator
2-
from .starlette import DatastarStreamingResponse
2+
from .starlette import DatastarStreamingResponse, read_signals

sdk/python/src/datastar_py/quart.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
from quart import make_response as _make_response
1+
import json
2+
from typing import Any
3+
4+
from quart import make_response as _make_response, request
25

36
from .sse import ServerSentEventGenerator, SSE_HEADERS
47

@@ -7,3 +10,10 @@ async def make_datastar_response(async_generator):
710
response = await _make_response(async_generator, SSE_HEADERS)
811
response.timeout = None
912
return response
13+
14+
15+
async def read_signals() -> dict[str, Any]:
16+
if request.method == "GET":
17+
return json.loads(request.args.get("datastar"))
18+
else:
19+
return await request.get_json()

sdk/python/src/datastar_py/sanic.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from typing import TYPE_CHECKING
1+
import json
2+
from typing import TYPE_CHECKING, Any
23

34
from .sse import SSE_HEADERS, ServerSentEventGenerator
45

@@ -9,3 +10,9 @@
910
async def datastar_respond(request: "Request") -> "HTTPResponse":
1011
response = await request.respond(headers=SSE_HEADERS)
1112
return response
13+
14+
async def read_signals(request: "Request") -> dict[str, Any]:
15+
if request.method == "GET":
16+
return json.loads(request.args.get("datastar"))
17+
else:
18+
return await request.json()

sdk/python/src/datastar_py/starlette.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1+
import json
12
from functools import wraps
3+
from typing import Any
24

5+
from starlette.requests import Request
36
from starlette.responses import StreamingResponse as _StreamingResponse
47

58
from .sse import SSE_HEADERS, ServerSentEventGenerator
@@ -10,3 +13,10 @@ class DatastarStreamingResponse(_StreamingResponse, ServerSentEventGenerator):
1013
def __init__(self, *args, **kwargs):
1114
kwargs["headers"] = {**SSE_HEADERS, **kwargs.get("headers", {})}
1215
super().__init__(*args, **kwargs)
16+
17+
18+
async def read_signals(request: Request) -> dict[str, Any]:
19+
if request.method == "GET":
20+
return json.loads(request.query_params.get("datastar"))
21+
else:
22+
return await request.json()

0 commit comments

Comments
 (0)