Generating a Page Dynamically — Twisted 15.2.1 documentation
Description: An event-driven networking engine written in Python and MIT licensed.

HOME FAQ DOCS DOWNLOAD

### Navigation

- index
- next |
- previous |
- Twisted 15.2.1 documentation »
- Twisted Web »
- Developer Guides »
- Twisted Web In 60 Seconds »

Go to the latest version of this document.

# Generating a Page Dynamically

The goal of this example is to show you how to dynamically generate the contents of a page.

Taking care of some of the necessary imports first, we’ll import Site and the reactor :

    from twisted.internet import reactor
    from twisted.web.server import Site

The Site is a factory which associates a listening port with the HTTP protocol implementation. The reactor is the main loop that drives any Twisted application; we’ll use it to actually create the listening port in a moment.

Next, we’ll import one more thing from Twisted Web: Resource . An instance of `Resource` (or a subclass) represents a page (technically, the entity addressed by a URI).

    from twisted.web.resource import Resource

Since we’re going to make the demo resource a clock, we’ll also import the time module:

    import time

With imports taken care of, the next step is to define a `Resource` subclass which has the dynamic rendering behavior we want. Here’s a resource which generates a page giving the time:

    class ClockPage(Resource):
        isLeaf = True
        def render_GET(self, request):
            return "<html><body>%s</body></html>" % (time.ctime(),)

Setting `isLeaf` to `True` indicates that `ClockPage` resources will never have any children.

The `render_GET` method here will be called whenever the URI we hook this resource up to is requested with the `GET` method. The byte string it returns is what will be sent to the browser.

With the resource defined, we can create a `Site` from it:

    resource = ClockPage()
    factory = Site(resource)

Just as with the previous static content example, this configuration puts our resource at the very top of the URI hierarchy, ie at `/` . With that `Site` instance, we can tell the reactor to create a TCP server and start servicing requests:

    reactor.listenTCP(8880, factory)
    reactor.run()

Here’s the code with no interruptions:

    from twisted.internet import reactor
    from twisted.web.server import Site
    from twisted.web.resource import Resource
    import time

    class ClockPage(Resource):
        isLeaf = True
        def render_GET(self, request):
            return "<html><body>%s</body></html>" % (time.ctime(),)

    resource = ClockPage()
    factory = Site(resource)
    reactor.listenTCP(8880, factory)
    reactor.run()