I’ve spent some more time on my current pet, txweb, and I think it’s pretty much at the as good as it gets stage.
Below is the source for the example.py
#App level
from txweb import Site, expose
#twisted
from twisted.web import server, resource
from twisted.internet import reactor
from twisted.web.static import File
from os.path import abspath, dirname, join
Mostly pretty standard imports for a twisted.web application.
Now here is the “Controllers”, they’re stripped down to bare-bones just to keep it simple
class PageOne(object):
@expose
def foo(self, request):
return "Hello From PageOne Foo!"
@expose
def delayed(self, request):
def delayedResponse():
request.write("I was delayed :( ")
request.finish()
reactor.callLater(5, delayedResponse)
return server.NOT_DONE_YET
class PageTwo(object):
@expose
def index(self, request):
""" /pagetwo/index """
return "Hello From PageTwo index!"
rootFile = lambda filename : abspath(join(dirname(__file__), filename))
class Root(object):
@expose
def index(self, request):
"""
Will handle both / and /index paths
"""
return "Hello From Index!"
@expose
def __default__(self, request):
"""
Unless overriden further down, this will catch all 404's
"""
return "I Caught %s " % request.path
pageone = PageOne()
pagetwo = PageTwo()
readme = File(rootFile("README.md"))
license = File(rootFile("txweb/LICENSE.txt"))
Basically a txWeb enabled twisted service converts a URL path to an Object path.
So /hello/world could resolve to root.hello.world() if such a construct was provided.
Much more importantly, with the above example, /license resolves to the local file txweb/LICENSE and /readme resolves to README.md !
In summary txweb doesn’t throw away the epic amount of work the Twisted developers and volunteers have put forth, it just presents it in another way.