Il framework Twisted (Python)

appunti su Twisted tratti da Jp Calderone

Uno script “minimo” basato su Twisted ha bisogno di 3 cose:

  1. una resource: crea i contenuti e li “porta” nel protocollo HTTP
  2. una factory: mette in contatto la porta in ascolto con il protocollo HTTP che serve i contenuti
  3. il reactor: è il controllore di tutto il processo, accetta le connessioni TCP e gestisce l’ input/output dei dati

Quindi la struttura di uno script è la seguente:

resource = SomeResourceClass(params....)
factory = SomeFactoryClass(resource)
reactor.listenTCP(int(port_number), factory)
reactor.run()

Esempio 1: generare un contenuto statico

http://jcalderone.livejournal.com/47954.html

from twisted.web.server import Site # importo la factory che genera un "sito"
from twisted.web.static import File #importo la resource che genera pagine in base al filesystem
from twisted.internet import reactor

resource = File('/tmp')
factory = Site(resource)
reactor.listenTCP(8888, factory)
try:
    reactor.run()
except KeyboardInterrupt:
    reactor.stop()

Esempio 2: generare un contenuto statico con diverse URL

http://jcalderone.livejournal.com/48795.html

from twisted.web.server import Site #la factory
from twisted.web.resource import Resource # una resource "vuota"
from twisted.web.static import File #la resource che genera contenuti
from twisted.internet import reactor

root = Resource()
# le resource che rispondono alle URL foo bar e baz mostrano i contenuti di diverse directory
#vengono "appese" alla risorsa root, che diventa così una struttura ad albero
root.putChild("foo", File("/tmp"))
root.putChild("bar", File("/lost+found"))
root.putChild("baz", File("/opt"))

factory = Site(root)
reactor.listenTCP(8880, factory)
reactor.run()

Esempio 3: generare un contenuto dinamico

http://jcalderone.livejournal.com/48953.html

from twisted.web.server import Site # factory
from twisted.web.resource import Resource #resource
from twisted.internet import reactor

from calendar import calendar # il calendario di python

class YearPage(Resource): # override di una Resource, sarà la figlia di Calendar
    def __init__(self, year):
        Resource.__init__(self)
        self.year = year
    # questo metodo viene chiamato dopo una richiesta GET
    def render_GET(self, request): # qui si genera il contenuto
        return "<html><body><pre>%s</pre></body></html>" % (calendar(self.year),)

class Calendar(Resource): #override di una Resource
  def getChild(self, name, request):
      return YearPage(int(name))

root = Calendar()
factory = Site(root)
reactor.listenTCP(8880, factory)
reactor.run()

Esempio 4: risposte asincrone con Deferred

http://jcalderone.livejournal.com/51109.html

from twisted.internet.task import deferLater # subclass di defer.Deferred
from twisted.web.resource import Resource
from twisted.web.server import NOT_DONE_YET
from twisted.internet import reactor

class DelayedResource(Resource):
    def _delayedRender(self, request): # viene chiamata come callback da render_GET
        request.write("Sorry to keep you waiting.") # crea un contenuto
        request.finish() # lo invia come risposta

    def render_GET(self, request): # risposta a GET
        d = deferLater(reactor, 5, lambda: request) # si crea il deferred
        d.addCallback(self._delayedRender) # gli si assegna una callback
        return NOT_DONE_YET # diciamo a render di non produrre adesso la risposta

resource = DelayedResource()

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...