


import time
from twisted.internet import reactor, defer, task
from twisted.application import internet, service
from nevow import appserver, livepage, loaders, tags


observers = []


def timer():
    for obs in observers:
        obs.send(livepage.set('time', time.asctime()))


task.LoopingCall(timer).start(1)


class Timer(livepage.LivePage):
    addSlash = True
    docFactory = loaders.stan(
    tags.html[
        tags.p(id="time"),
        livepage.glue])

    def goingLive(self, ctx, handle):
        observers.append(handle)
        handle.notifyOnClose().addCallback(self.lost, handle).addErrback(self.lost, handle)

    def lost(self, why, handle):
        print "lost", why
        observers.remove(handle)


root = Timer()


application = service.Application('live')
internet.TCPServer(
    8080, appserver.NevowSite(root,logPath='web.log')
).setServiceParent(application)

