Web interface for a twisted application
Asked Answered
Z

3

10

I have a application written in Twisted and I want to add a web interface to control and monitor it. I'll need plenty of dynamic pages that show the current status and configuration, so I hoped for a framework that offers at least a templating language with inheritance and some basic routing.

Since I am using Twisted anyways I wanted to use twisted.web - but it's templating language is too basic and it seems that the only framework, Nevow is quite dead (it's on launchpad but the homepage and wiki are down and I can't find any documentation).

So what are my options?

  • Is there any other twisted.web based framework?
  • Are there other frameworks that work with twisted's reactor?
  • Should I just get a web framework (I'm thinking web.py or flask) and run it in a thread?

Thanks for your answers.

Zamindar answered 9/3, 2011 at 16:26 Comment(1)
@Jean-Paul Calderone - I'm sure Nevow is nice; I'm impressed with all divmod projects. But with divmod.org down it's really difficult for a beginner to find documentation.Glycogenesis
Z
14

Since Nevow is still down and I didn't want to write routing and support for a templating lib myself, I ended up using Flask. It turned out to be quite easy:

# make a Flask app
from flask import Flask, render_template, g
app = Flask(__name__)
@app.route("/")
def index():
    return render_template("index.html")

# run in under twisted through wsgi
from twisted.web.wsgi import WSGIResource
from twisted.web.server import Site

resource = WSGIResource(reactor, reactor.getThreadPool(), app)
site = Site(resource)

# bind it etc
# ...

It works flawlessly so far.

Zamindar answered 15/3, 2011 at 15:32 Comment(4)
Could you please elaborate on bind it etc please? Like that we would have a fully contained, runnable example... for those not so well versed in twisted :)Enfilade
@Enfilade reactor.listenTCP( 80, site ) will bind the flask app to port 80Activate
It's two years later now. Flask and Twisted are alive and well, and I'm considering doing something similar. Did this end up working for you, or did you run into some issues?Kyrakyriako
Can inlineCallbacks be mixed with Flask when running like this?Really
Z
6

You can bind it directly into the reactor like the example below:

reactor.listenTCP(5050, site)
reactor.run()

If you need to add children to a WSGI root visit this link for more details.

Here is an example showing how to combine WSGI Resource with a static child.

from twisted.internet import reactor
from twisted.web import static as Static, server, twcgi, script, vhost
from twisted.web.resource import Resource
from twisted.web.wsgi import WSGIResource
from flask import Flask, g, request

class Root( Resource ):
    """Root resource that combines the two sites/entry points"""
    WSGI = WSGIResource(reactor, reactor.getThreadPool(), app)
    def getChild( self, child, request ):
        # request.isLeaf = True
        request.prepath.pop()
        request.postpath.insert(0,child)
        return self.WSGI
    def render( self, request ):
        """Delegate to the WSGI resource"""
        return self.WSGI.render( request )

def main():
static = Static.File("/path/folder")
static.processors = {'.py': script.PythonScript,
                 '.rpy': script.ResourceScript}
static.indexNames = ['index.rpy', 'index.html', 'index.htm']

root = Root()
root.putChild('static', static)

reactor.listenTCP(5050, server.Site(root))
reactor.run()
Zincate answered 23/6, 2011 at 0:5 Comment(0)
N
3

Nevow is the obvious choice. Unfortunately the divmod web server hardware and the backup server hardware failed at the same time. They are attempting to recover the data and publish it on launchpad, but it may take a while.

You could also use basically any existing template module with twisted.web; Jinja2 comes to mind.

Narco answered 9/3, 2011 at 16:33 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.