Difficulty: Advanced
How do you implement streaming responses and Server-Sent Events (SSE) in FastAPI?
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.
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"}
)
StreamingResponse, SSE, generators, real-time updates