Skip to main content

Control the web with Python

Project description

iDOM

Build Status License: MIT

Libraries for creating and controlling interactive web pages with Python 3.6 and above.

iDOM is still young. If you have ideas or find a bug, be sure to post an issue or create a pull request. Thanks in advance!

Try it Now Binder

Click the badge above to get started! It will take you to a Jupyter Notebooks hosted by Binder with some great examples.

Or Install it Now

pip install idom

At a Glance

iDOM can be used to create a simple slideshow which changes whenever a user clicks an image.

import idom

@idom.element
async def Slideshow(self, index=0):
    events = idom.Events()

    @events.on("click")
    async def change():
        self.update(index + 1)

    url = f"https://picsum.photos/800/300?image={index}"
    return idom.node("img", src=url, eventHandlers=events)

server = idom.server.sanic.PerClientState(Slideshow)
server.daemon("localhost", 8765).join()

Running this will serve our slideshow to "https://localhost:8765/client/index.html"

You could even display the same thing in a Jupyter notebook!

idom.display("jupyter", "https://localhost:8765/stream")

Every click will then cause the image to change (it won't here of course).

Breaking it Down

That might have been a bit much to throw out at once. Let's break down each piece of the example above:

@idom.element
async def Slideshow(self, index=0):

The idom.element decorator indicates that the asynchronous function to follow returns a data structure which represents a user interface or Document Object Model (DOM). We call this structural representation of the DOM a [Virtual DOM] (VDOM) - a term familiar to those who work with ReactJS. In the case of Slideshow it will return a VDOM representing an image which, when clicked, will change.

    events = idom.Events()

Events creates an object to which event handlers will be assigned. Adding an Events object to a VDOM will given you the ability to respond when users interact with you interface. Under the hood though, Events is just a mapping that conforms to the VDOM event specification.

    @events.on("click")
    def change():
        self.update(index + 1)

By using the Events object we created above, we can register a function as an event handler. In this case our handler is listening for onClick events and will be called once a user clicks on the image. All supported events are listed here.

You can add parameters to this handler which will allow you to access attributes of the JavaScript event which occurred in the browser. For example when a key is pressed in an <input/> element you can access the key's name by adding a key parameter to the event handler.

Inside the handler itself we update self which is out Slideshow element. Calling self.update(*args, **kwargs) will schedule a new render of the Slideshow element to be performed with new *args and **kwargs.

    url = f"https://picsum.photos/800/300?image={index}"
    return idom.node("img", src=url, eventHandlers=events)

We return a VDOM for an <img/> element which draws its image from https://picsum.photos and will respond to the events we defined earlier. Similarly to the events object idom.node returns a mapping which conforms to the VDOM mimetype specification

server = idom.server.sanic.PerClientState(Slideshow)
server.daemon("localhost", 8765).join()

This sets up a simple web server which will display the layout of elements and update them when events occur over a websocket. The server has "per client state" because each client that connects to it will see a fresh view of the layout. If clients should see views with a common state you can use the SharedClientState server.

To display the layout we can navigate to http://localhost:8765/client/index.html or use idom.display() to show it in a Jupyter Notebook via a widget. The exact protocol for communicating VDOM over a network is not documented yet.

Adding iDOM To Existing Applications

If you want to add iDOM to an existing server you can register its routes instead:

from sanic import Sanic

app = Sanic()
extension = idom.server.sanic.PerClientState(Slideshow)
extension.configure(url_prefix="/idom").register(app)

app.run()

Project details


Release history Release notifications | RSS feed

Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

idom-0.4.0-py3-none-any.whl (458.9 kB view hashes)

Uploaded Python 3

Supported by

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