Merge 3a166394ad
into 8b84986410
This commit is contained in:
commit
6d042afd0a
|
@ -4,7 +4,7 @@ from datetime import datetime
|
||||||
|
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
|
|
||||||
from datastar_py.django import DatastarStreamingHttpResponse
|
from datastar_py.django import DatastarStreamingHttpResponse, ServerSentEventGenerator
|
||||||
|
|
||||||
|
|
||||||
# ASGI Example
|
# ASGI Example
|
||||||
|
@ -51,11 +51,11 @@ async def home_asgi(request):
|
||||||
async def updates_asgi(request):
|
async def updates_asgi(request):
|
||||||
async def time_updates():
|
async def time_updates():
|
||||||
while True:
|
while True:
|
||||||
yield DatastarStreamingHttpResponse.merge_fragments(
|
yield ServerSentEventGenerator.merge_fragments(
|
||||||
[f"""<span id="currentTime">{datetime.now().isoformat()}"""]
|
[f"""<span id="currentTime">{datetime.now().isoformat()}"""]
|
||||||
)
|
)
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
yield DatastarStreamingHttpResponse.merge_signals(
|
yield ServerSentEventGenerator.merge_signals(
|
||||||
{"currentTime": f"{datetime.now().isoformat()}"}
|
{"currentTime": f"{datetime.now().isoformat()}"}
|
||||||
)
|
)
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
|
@ -109,11 +109,11 @@ def home_wsgi(request):
|
||||||
def updates_wsgi(request):
|
def updates_wsgi(request):
|
||||||
def time_updates():
|
def time_updates():
|
||||||
while True:
|
while True:
|
||||||
yield DatastarStreamingHttpResponse.merge_fragments(
|
yield ServerSentEventGenerator.merge_fragments(
|
||||||
[f"""<span id="currentTime">{datetime.now().isoformat()}"""]
|
[f"""<span id="currentTime">{datetime.now().isoformat()}"""]
|
||||||
)
|
)
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
yield DatastarStreamingHttpResponse.merge_signals(
|
yield ServerSentEventGenerator.merge_signals(
|
||||||
{"currentTime": f"{datetime.now().isoformat()}"}
|
{"currentTime": f"{datetime.now().isoformat()}"}
|
||||||
)
|
)
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
|
|
|
@ -4,7 +4,7 @@ from datetime import datetime
|
||||||
from fastapi import FastAPI
|
from fastapi import FastAPI
|
||||||
from fastapi.responses import HTMLResponse
|
from fastapi.responses import HTMLResponse
|
||||||
|
|
||||||
from datastar_py.fastapi import DatastarStreamingResponse
|
from datastar_py.fastapi import DatastarStreamingResponse, ServerSentEventGenerator
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
@ -53,11 +53,11 @@ async def read_root():
|
||||||
|
|
||||||
async def time_updates():
|
async def time_updates():
|
||||||
while True:
|
while True:
|
||||||
yield DatastarStreamingResponse.merge_fragments(
|
yield ServerSentEventGenerator.merge_fragments(
|
||||||
[f"""<span id="currentTime">{datetime.now().isoformat()}"""]
|
[f"""<span id="currentTime">{datetime.now().isoformat()}"""]
|
||||||
)
|
)
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
yield DatastarStreamingResponse.merge_signals({"currentTime": f"{datetime.now().isoformat()}"})
|
yield ServerSentEventGenerator.merge_signals({"currentTime": f"{datetime.now().isoformat()}"})
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ from fasthtml.common import *
|
||||||
from great_tables import GT, html
|
from great_tables import GT, html
|
||||||
from great_tables.data import reactions
|
from great_tables.data import reactions
|
||||||
|
|
||||||
from datastar_py.fasthtml import DatastarStreamingResponse
|
from datastar_py.fasthtml import DatastarStreamingResponse, ServerSentEventGenerator
|
||||||
|
|
||||||
######################################################################################################
|
######################################################################################################
|
||||||
# This demo shows how FastHTML can be integrated with Datastar for server-driven interaction with a #
|
# This demo shows how FastHTML can be integrated with Datastar for server-driven interaction with a #
|
||||||
|
@ -93,7 +93,7 @@ def GreatTable(pattern=default_pattern):
|
||||||
@app.post
|
@app.post
|
||||||
async def table(filter: str):
|
async def table(filter: str):
|
||||||
async def _():
|
async def _():
|
||||||
yield DatastarStreamingResponse.merge_fragments([GreatTable(filter)])
|
yield ServerSentEventGenerator.merge_fragments([GreatTable(filter)])
|
||||||
|
|
||||||
return DatastarStreamingResponse(_())
|
return DatastarStreamingResponse(_())
|
||||||
|
|
||||||
|
@ -151,7 +151,7 @@ def index():
|
||||||
async def clock():
|
async def clock():
|
||||||
while True:
|
while True:
|
||||||
now = datetime.isoformat(datetime.now())
|
now = datetime.isoformat(datetime.now())
|
||||||
yield DatastarStreamingResponse.merge_fragments([Span(id="currentTime")(now)])
|
yield ServerSentEventGenerator.merge_fragments([Span(id="currentTime")(now)])
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
|
|
||||||
|
|
||||||
|
@ -165,7 +165,7 @@ async def hello():
|
||||||
async def _():
|
async def _():
|
||||||
# Simulate load time
|
# Simulate load time
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
yield DatastarStreamingResponse.merge_fragments([HELLO_BUTTON])
|
yield ServerSentEventGenerator.merge_fragments([HELLO_BUTTON])
|
||||||
|
|
||||||
return DatastarStreamingResponse(_())
|
return DatastarStreamingResponse(_())
|
||||||
|
|
||||||
|
@ -183,11 +183,11 @@ async def reset():
|
||||||
Div("Hello!"),
|
Div("Hello!"),
|
||||||
)
|
)
|
||||||
|
|
||||||
async def _(sse):
|
async def _():
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
yield sse.merge_fragments([reset_and_hello])
|
yield ServerSentEventGenerator.merge_fragments([reset_and_hello])
|
||||||
|
|
||||||
return DatastarFastHTMLResponse(_)
|
return DatastarStreamingResponse(_())
|
||||||
|
|
||||||
|
|
||||||
# Define the button once so that it can be used in the index response
|
# Define the button once so that it can be used in the index response
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
import asyncio
|
import asyncio
|
||||||
import json
|
import json
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from fasthtml.common import *
|
from fasthtml.common import *
|
||||||
|
|
||||||
from datastar_py.fasthtml import DatastarStreamingResponse
|
from datastar_py.fasthtml import DatastarStreamingResponse, ServerSentEventGenerator
|
||||||
|
|
||||||
repo_root = next(p for p in Path(__file__).parents if (p / ".git").exists())
|
repo_root = next(p for p in Path(__file__).parents if (p / ".git").exists())
|
||||||
|
|
||||||
|
@ -46,9 +45,9 @@ async def index():
|
||||||
async def clock():
|
async def clock():
|
||||||
while True:
|
while True:
|
||||||
now = datetime.isoformat(datetime.now())
|
now = datetime.isoformat(datetime.now())
|
||||||
yield DatastarStreamingResponse.merge_fragments([Span(id="currentTime")(now)])
|
yield ServerSentEventGenerator.merge_fragments([Span(id="currentTime")(now)])
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
yield DatastarStreamingResponse.merge_signals({"currentTime": f"{now}"})
|
yield ServerSentEventGenerator.merge_signals({"currentTime": f"{now}"})
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -4,9 +4,8 @@ from datetime import datetime
|
||||||
from sanic import Sanic
|
from sanic import Sanic
|
||||||
from sanic.response import html
|
from sanic.response import html
|
||||||
|
|
||||||
from datastar_py import ServerSentEventGenerator as SSE
|
|
||||||
from datastar_py.consts import FragmentMergeMode
|
from datastar_py.consts import FragmentMergeMode
|
||||||
from datastar_py.sanic import datastar_respond
|
from datastar_py.sanic import datastar_respond, ServerSentEventGenerator
|
||||||
|
|
||||||
app = Sanic("DataStarApp")
|
app = Sanic("DataStarApp")
|
||||||
|
|
||||||
|
@ -57,7 +56,7 @@ async def add_signal(request):
|
||||||
response = await datastar_respond(request)
|
response = await datastar_respond(request)
|
||||||
|
|
||||||
await response.send(
|
await response.send(
|
||||||
SSE.merge_fragments(
|
ServerSentEventGenerator.merge_fragments(
|
||||||
[
|
[
|
||||||
"""
|
"""
|
||||||
<div class="time signal">
|
<div class="time signal">
|
||||||
|
@ -66,7 +65,7 @@ async def add_signal(request):
|
||||||
"""
|
"""
|
||||||
],
|
],
|
||||||
selector="#timers",
|
selector="#timers",
|
||||||
merge_mode=FragmentMergeMode.FragmentMergeModeAppend,
|
merge_mode=FragmentMergeMode.APPEND,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -78,7 +77,7 @@ async def add_fragment(request):
|
||||||
response = await datastar_respond(request)
|
response = await datastar_respond(request)
|
||||||
|
|
||||||
await response.send(
|
await response.send(
|
||||||
SSE.merge_fragments(
|
ServerSentEventGenerator.merge_fragments(
|
||||||
[
|
[
|
||||||
f"""\
|
f"""\
|
||||||
<div class="time fragment">
|
<div class="time fragment">
|
||||||
|
@ -87,7 +86,7 @@ async def add_fragment(request):
|
||||||
"""
|
"""
|
||||||
],
|
],
|
||||||
selector="#timers",
|
selector="#timers",
|
||||||
merge_mode=FragmentMergeMode.FragmentMergeModeAppend,
|
merge_mode=FragmentMergeMode.APPEND,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -100,7 +99,7 @@ async def updates(request):
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
await response.send(
|
await response.send(
|
||||||
SSE.merge_fragments(
|
ServerSentEventGenerator.merge_fragments(
|
||||||
[
|
[
|
||||||
f"""
|
f"""
|
||||||
<div class="time fragment" >
|
<div class="time fragment" >
|
||||||
|
@ -113,6 +112,6 @@ async def updates(request):
|
||||||
)
|
)
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
await response.send(
|
await response.send(
|
||||||
SSE.merge_signals({"currentTime": f"{datetime.now().isoformat()}"})
|
ServerSentEventGenerator.merge_signals({"currentTime": f"{datetime.now().isoformat()}"})
|
||||||
)
|
)
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
|
|
|
@ -5,7 +5,7 @@ from django.http import StreamingHttpResponse as _StreamingHttpResponse
|
||||||
from .sse import SSE_HEADERS, ServerSentEventGenerator
|
from .sse import SSE_HEADERS, ServerSentEventGenerator
|
||||||
|
|
||||||
|
|
||||||
class DatastarStreamingHttpResponse(_StreamingHttpResponse, ServerSentEventGenerator):
|
class DatastarStreamingHttpResponse(_StreamingHttpResponse):
|
||||||
@wraps(_StreamingHttpResponse.__init__)
|
@wraps(_StreamingHttpResponse.__init__)
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
kwargs["headers"] = {**SSE_HEADERS, **kwargs.get("headers", {})}
|
kwargs["headers"] = {**SSE_HEADERS, **kwargs.get("headers", {})}
|
||||||
|
|
|
@ -2,11 +2,11 @@ from typing import override
|
||||||
|
|
||||||
from fastcore.xml import to_xml
|
from fastcore.xml import to_xml
|
||||||
|
|
||||||
from .sse import SSE_HEADERS, ServerSentEventGenerator
|
from .sse import SSE_HEADERS, ServerSentEventGenerator as _ServerSentEventGenerator
|
||||||
from .starlette import DatastarStreamingResponse as _DatastarStreamingResponse
|
from .starlette import DatastarStreamingResponse
|
||||||
|
|
||||||
|
|
||||||
class DatastarStreamingResponse(_DatastarStreamingResponse):
|
class ServerSentEventGenerator(_ServerSentEventGenerator):
|
||||||
@classmethod
|
@classmethod
|
||||||
@override
|
@override
|
||||||
def merge_fragments(cls, fragments, *args, **kwargs):
|
def merge_fragments(cls, fragments, *args, **kwargs):
|
||||||
|
|
|
@ -5,7 +5,7 @@ from starlette.responses import StreamingResponse as _StreamingResponse
|
||||||
from .sse import SSE_HEADERS, ServerSentEventGenerator
|
from .sse import SSE_HEADERS, ServerSentEventGenerator
|
||||||
|
|
||||||
|
|
||||||
class DatastarStreamingResponse(_StreamingResponse, ServerSentEventGenerator):
|
class DatastarStreamingResponse(_StreamingResponse):
|
||||||
@wraps(_StreamingResponse.__init__)
|
@wraps(_StreamingResponse.__init__)
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
kwargs["headers"] = {**SSE_HEADERS, **kwargs.get("headers", {})}
|
kwargs["headers"] = {**SSE_HEADERS, **kwargs.get("headers", {})}
|
||||||
|
|
Loading…
Reference in New Issue