WSGI support for the Tornado web framework.
WSGI is the Python standard for web servers, and allows for interoperability between Tornado and other Python web frameworks and servers. This module provides WSGI support in two ways:
WSGIAdapter
converts atornado.web.Application
to the WSGI application interface. This is useful for running a Tornado app on another HTTP server, such as Google App Engine. See theWSGIAdapter
class documentation for limitations that apply.WSGIContainer
lets you run other WSGI applications and frameworks on the Tornado HTTP server. For example, with this class you can mix Django and Tornado handlers in a single server.
Running Tornado apps on WSGI servers
class tornado.wsgi.WSGIAdapter(application)[source]
Converts a tornado.web.Application
instance into a WSGI application.
Example usage:
import tornado.web
import tornado.wsgi
import wsgiref.simple_server
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
if __name__ == "__main__":
application = tornado.web.Application([
(r"/", MainHandler),
])
wsgi_app = tornado.wsgi.WSGIAdapter(application)
server = wsgiref.simple_server.make_server('', 8888, wsgi_app)
server.serve_forever()
See the appengine demo for an example of using this module to run a Tornado app on Google App Engine.
In WSGI mode asynchronous methods are not supported. This means
that it is not possible to use AsyncHTTPClient
, or the
tornado.auth
or tornado.websocket
modules.
New in version 4.0.
class tornado.wsgi.WSGIApplication(handlers=None, default_host=None, transforms=None, **settings)[source]
A WSGI equivalent of tornado.web.Application
.
Deprecated since version 4.0: Use a regular Application
and wrap it in WSGIAdapter
instead.
Running WSGI apps on Tornado servers
class tornado.wsgi.WSGIContainer(wsgi_application)[source]
Makes a WSGI-compatible function runnable on Tornado’s HTTP server.
Warning
WSGI is a synchronous interface, while Tornado’s concurrency model
is based on single-threaded asynchronous execution. This means that
running a WSGI app with Tornado’s WSGIContainer
is less scalable
than running the same app in a multi-threaded WSGI server like
gunicorn
or uwsgi
. Use WSGIContainer
only when there are
benefits to combining Tornado and WSGI in the same process that
outweigh the reduced scalability.
Wrap a WSGI function in a WSGIContainer
and pass it to HTTPServer
to
run it. For example:
def simple_app(environ, start_response):
status = "200 OK"
response_headers = [("Content-type", "text/plain")]
start_response(status, response_headers)
return ["Hello world!\n"]
container = tornado.wsgi.WSGIContainer(simple_app)
http_server = tornado.httpserver.HTTPServer(container)
http_server.listen(8888)
tornado.ioloop.IOLoop.current().start()
This class is intended to let other frameworks (Django, web.py, etc) run on the Tornado HTTP server and I/O loop.
The tornado.web.FallbackHandler
class is often useful for mixing
Tornado and WSGI apps in the same server. See
https://github.com/bdarnell/django-tornado-demo for a complete example.
static environ()[source]
Converts a tornado.httputil.HTTPServerRequest
to a WSGI environment.