We compile the client-side Python code to Javascript using Skulpt (http://skulpt.org), and we render the visual components in HTML, but you interact with them entirely in Python.
This creates a much less "leaky" abstraction than building a new framework directly on top of HTML/JS. It also lets us offer things like blocking I/O operations (no more callback hell!).