[Twisted-Python] Simplifying my StatusMonitor

Brad Bollenbach brad at bbnet.ca
Thu Jul 17 14:30:15 MDT 2003


Hi,

Okay, in the usual XP fashion, I'm doing a spike to assess two use cases
for Twisted:

1. Writing a simple monitor that checks the status of a response, to see
what it's like to write a foobar in Twisted.

2. How to schedule multiple monitor batches so they can run and report
back to a "central command" (maybe CentralCommand or something), which
can then determine whether or not (and to whom) an error report should
be sent. (I've scrapped the idea of a "monicron")

I did #1 this morning. It's 49 lines of Python, in what would have
otherwise been less than five of "normal", blocking code:

==== begin code ====

#!/usr/bin/python2.2

from twisted.web import client

class HTTPPageStatusGetter(client.HTTPPageGetter):
    """A getter that tells clients the status of a response"""
    
    def handleStatus(self, version, status, message):
        client.HTTPPageGetter.handleStatus(self, version, status, message)
        self.factory.status(status)

class StatusMonitorFactory(client.HTTPClientFactory):
    """An HTTP Monitor that does something interesting with the
    HTTP status returned."""

    protocol = HTTPPageStatusGetter

    def page(self, page):
        pass

    def noPage(self, reason):
        pass
        
    def status(self, status):
        if self.waiting:
            self.waiting = 0
            self.deferred.callback(status)
    
class StatusMonitor:
    def checkFor200OK(self, url):
        host, port, url = client._parse(url)
        factory = StatusMonitorFactory(host, url)
        reactor.connectTCP(host, port, factory)
        factory.deferred.addCallback(self.gotStatus, url)
        factory.deferred.addErrback(self.reportError, url)
        return factory.deferred

    def gotStatus(self, status, url):
        print "hooray, got status %s" % status

    def reportError(self, failure, url):
        print ":( There was a problem in %s" % url
        print failure

from twisted.internet import reactor

d = StatusMonitor().checkFor200OK('http://www.bbnet.ca/')
d.addCallback(lambda *a: reactor.stop())
reactor.run()

==== end code ====

How could I have made this simpler? What approach would you have taken
to solve this problem?

--
Brad Bollenbach
BBnet.ca




More information about the Twisted-Python mailing list