Skip to main content

minimal python sse server

Project description

PyPI version

[!WARNING] Under active development — May 2026

py_sse

A minimal SSE web framework for Python 3.13+. Real-time hypermedia over HTTP/1.1 with brotli-compressed Server-Sent Events.

One OS thread per connection. Topic-scoped pub/sub via hierarchical subjects. No async/await. Pure stdlib + brotli + apsw.

Install

uv add py-sse

Hello world

from py_sse import serve, html

def get_root(req):
    return html("<h1>hello, world</h1>")

serve([("GET", "/", get_root)], host="0.0.0.0", port=8000)

Real-time updates

from py_sse import serve, html, Changes, Database, stream_handler

db = Database("app.db", schema="CREATE TABLE IF NOT EXISTS msg (id INTEGER PRIMARY KEY, text TEXT)")

def post_msg(req):
    db.execute("INSERT INTO msg (text) VALUES (?)", (req["body"].decode(),))
    db.changes.notify("msg")
    return ("", [], b"")

@stream_handler(
    resource_id_fn=lambda req: "msgs",
    subscribe_to=lambda req: "msg",
)
def get_msgs(req):
    rows = db.all("SELECT id, text FROM msg ORDER BY id DESC")
    body = "<ul>" + "".join(f"<li>{t}</li>" for _, t in rows) + "</ul>"
    return html(f"<html><body>{body}</body></html>")

serve(
    [("GET", "/", get_msgs), ("POST", "/msg", post_msg)],
    changes=db.changes,
)

Design

  • Pages are database snapshots. Every render is the truth as of query time.
  • Fat morphs. SSE frames send the whole page; idiomorph patches the DOM; brotli compresses across frames.
  • Topic-scoped pub/sub. changes.notify("game.5.score") wakes only viewers waiting on matching patterns.
  • Graceful degradation. Past the live cap, viewers get one-shot HTML with data-on-interval for polling.
  • One thread per connection. The thread IS the subscription. When it dies, the subscription dies. No registry.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

py_sse-0.7.0.tar.gz (11.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

py_sse-0.7.0-py3-none-any.whl (13.4 kB view details)

Uploaded Python 3

File details

Details for the file py_sse-0.7.0.tar.gz.

File metadata

  • Download URL: py_sse-0.7.0.tar.gz
  • Upload date:
  • Size: 11.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux ARM","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for py_sse-0.7.0.tar.gz
Algorithm Hash digest
SHA256 47397ca682db4ad90dd9561f7153a00111feba682366f82251d037902f257d73
MD5 1907436f6bf15294693b6fe2e2a18266
BLAKE2b-256 7105cbb6f7f111ffc7d28690de7456b096fbb15e92222954443f8e4aef357ece

See more details on using hashes here.

File details

Details for the file py_sse-0.7.0-py3-none-any.whl.

File metadata

  • Download URL: py_sse-0.7.0-py3-none-any.whl
  • Upload date:
  • Size: 13.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.6 {"installer":{"name":"uv","version":"0.11.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Arch Linux ARM","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for py_sse-0.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 24b7ff4367146aac8a6f4ce3628bfbca875d775ab998cf85378c4db1f770d8ca
MD5 009abe902835105c48b6d6fe0b27b0f0
BLAKE2b-256 b4d6fae8ce6ef279bbda89b1aee117c29455612610045e7a4b47d2f0573a41eb

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page