之前一直很想知道,在Tornado上是如何运行其他WSGI应用的,例如利用Twisted,可以作为Flask、Bottle、Django运行的服务器。近日在查看tornado的官方文档时,总算找到了对应的方式了。
在Tornado中,我们可以通过wsgi模块下的WSGIContainer类来实现这样的需求。这里,我们使用Bottle作为例子,来查看这个过程。

from bottle import Bottle

app = Bottle()

@app.route(\'/\'):
def index():
    return \'Hello World\'

现在,我们编写了1个简单的访问根URL时输出1个Hello World的简单应用了。
接下来,我们让这个Bottle的应用在tornado上运行,我们引入tornado库:

import tornado

然后将要托管的应用以参数的形式传入到WSGIContainer类中:

container = tornado.wsgi.WSGIContainer(app)

接下来,我们定义1个HTTP服务器,用于提供服务:

http_server = tornado.httpserver.HTTPServer(container)

紧接着,我们定义这个服务器监听的端口:

http_server.listen(8888)

最后,我们启动这个服务器:

tornado.ioloop.IOLoop.current().start()

此时访问127.0.0.1:8888,将看到1个Hello World的字符串。
需要注意的是,由于Tornado的并发模型是建立在单线程异步执行的基础上的,因此它运行1个WSGI应用比使用多线程的WSGI服务器要弱很多。当然,这种方式在Tornado和WSGI在相同进程时有用,否则将减少可扩展性。
相比而言,twisted的WSGI服务器使用多进程的方式运行的,因此在项目开发中,还是以twisted为主。

参考文章:

http://www.tornadoweb.org/en/stable/wsgi.html#running-wsgi-apps-on-tornado-servers