This is a collection of addons and accompanying unit tests for the excellent Tornado web server
These addons are licensed the same as Tornado under the Apache Licence, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.html).
Just place this directory in your python path or run the following:
sudo python setup.py install
Every addon will have a set of accompanying unit tests. We prefer to run them via Nose.
cd tornado_addons/
nosetests
The best source of information is the comments in routes.py or async_yield.py. They're fairly well commented and give a better understanding of the libs.
Here's a simple example.
import tornado.web
from tornado_addons.route import route
@route('/blah')
class SomeHandler(tornado.web.RequestHandler):
pass
t = tornado.web.Application(route.get_routes(), {'some app': 'settings'}
Here's an example with normal callbacks.
from tornado.httpclient import AsyncHTTPClient
@tornado.web.asynchronous
class SomeHandler(tornado.web.RequestHandler):
def get(self):
self.somedata = 'xxx'
AsyncHTTPClient.fetch( 'http://over/there',
callback=self.my_async_http_cb )
def my_async_http_cb(self, fetch_data):
# do stuff with fetchdata here
self.write(self.somedata)
Or, you can wrap your methods with async_yield...
from tornado_addons.async_yield import async_yield, AsyncYieldMixin
class SomeHandler(tornado.web.RequestHandler, AsyncYieldMixin):
@async_yield
def some_func(self, callback):
x = yield some_async_call(callback=self.yield_cb)
callback(x)
@async_yield
@tornado.web.asynchronous
def get(self):
ycb = self.yield_cb
retval = yield some_func(ycb)
somedata = 'xxx'
fetchdata = yield AsyncHTTPClient.fetch( 'http://over/there',
callback=ycb )
# do stuff with fetchdata here
self.write(fetchdata.body if not fetchdata.error else '')
The @async_yield wrapper works for methods bound to a RequestHandler.
Cushion is a bit of an extraction layer around trombi, an asynchronous CouchDB driver for Tornado.
It provides a mixin for RequestHandler that simplifies database access, especially when used in conjunction with async_yield.
from tornado.web import RequestHandler
from tornado_addons.cushion import CushionDBMixin
from tornado_addons.async_yield import async_yield, AsyncYieldMixin
class SomeHandler(RequestHandler, CushionDBMixin, AsyncYieldMixin):
@async_yield
@tornado.web.asynchronous
def get(self):
ycb = self.mycb('get')
yield self.db_setup('someDB', uri_to_couchdb, ycb)
x = yield self.db_one('some_key', ycb)
# ... do stuff wth your data in x now
self.finish()