Yield Styles
@sse_stream accepts any of these yield styles — use whichever feels most natural.
Plain string
The simplest style — yields an unnamed message event.
Wire format:
Tuple — (event, data)
The most common style. data can be any JSON-serialisable value.
@sse_stream
def view(request):
yield ("update", {"count": 1})
yield ("update", {"count": 2})
yield ("complete", "done")
Wire format:
Tuple — (event, data, id)
Same as above, but includes an event ID. Useful for client-side reconnection
— the browser sends the last id in the Last-Event-ID header on reconnect.
@sse_stream
def view(request):
yield ("update", {"count": 1}, "evt-001")
yield ("update", {"count": 2}, "evt-002")
Wire format:
Dict with "data" key
Maps directly to SSEEvent fields. Useful when you want to pass all
fields in one expression.
@sse_stream
def view(request):
yield {"data": "hello", "event": "greet"}
yield {"data": {"count": 1}, "event": "update", "id": "evt-1"}
Supported keys: data, event, id, retry.
Dict without "data" key
The entire dict is serialised as JSON and used as the event payload.
Wire format:
SSEEvent object
Full control over every SSE field.
from django_flosse import SSEEvent
@sse_stream
def view(request):
yield SSEEvent(
data = {"status": "done"},
event = "complete",
id = "final",
retry = 5000, # tell browser: wait 5s before reconnecting
)
Wire format:
Summary
| What you yield | Event name | Has ID | Has retry |
|---|---|---|---|
"hello" |
(unnamed) | ✗ | ✗ |
("update", data) |
update |
✗ | ✗ |
("update", data, "id-1") |
update |
✓ | ✗ |
{"data": x, "event": "e"} |
e |
✓* | ✓* |
{"foo": "bar"} |
(unnamed) | ✗ | ✗ |
SSEEvent(data=x, event="e", id="1") |
e |
✓ | ✓ |
Tip
Dict data and all non-string values are serialised to JSON automatically.
You never need to call json.dumps() yourself.