Streaming responses and Server-Sent Events

Difficulty: Advanced

Question

How do you implement streaming responses and Server-Sent Events (SSE) in FastAPI?

Answer

StreamingResponse sends data in chunks using a generator or async generator. Useful for large files, real-time logs, or AI chat responses (like ChatGPT's streaming output).

Server-Sent Events (SSE) are a protocol for server-to-client streaming over HTTP. The server sends events in `text/event-stream` format. Unlike WebSockets, SSE is unidirectional (server → client only) and uses regular HTTP - simpler to deploy behind load balancers and proxies.

SSE format: each event is `data: <payload>\n\n`. Named events use `event: <name>\n`.

For production SSE, use the `sse-starlette` library which handles connection management and heartbeats.

Code examples

Streaming response and SSE

from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import asyncio
import json

app = FastAPI()

# 1. Streaming a large file
@app.get("/download")
async def download_large_file():
    async def generate():
        with open("large_file.csv", "rb") as f:
            while chunk := f.read(8192):
                yield chunk
    return StreamingResponse(generate(), media_type="text/csv")

# 2. Server-Sent Events for real-time updates
@app.get("/events")
async def event_stream():
    async def generate():
        for i in range(10):
            data = json.dumps({"count": i, "message": f"Update {i}"})
            yield f"data: {data}\n\n"
            await asyncio.sleep(1)
        yield "data: [DONE]\n\n"
    return StreamingResponse(
        generate(),
        media_type="text/event-stream",
        headers={"Cache-Control": "no-cache", "Connection": "keep-alive"}
    )

Key points

Concepts covered

StreamingResponse, SSE, generators, real-time updates