Tornado的支持

开发服务器的tornado支持

目前uliweb在启动开发服务器时,可以通过:

uliweb runserver --tornado

来启动tornado,并用它来跑uliweb应用。同时还支持reload和ssl。

那么我是如何实现的,在这里描述一下:

修改 manage.py 下的 RunserverCommand 类:

  1. 増加 --tornado 选项支持
  2. 増加对 tornado 模式的支持

    if options.tornado:
        try:
            import tornado
            import tornado.wsgi
            import tornado.httpserver
            import tornado.ioloop
            import tornado.autoreload
        except:
            print 'Error: Please install tornado first'
            sys.exit(1)
           
        if options.ssl:
            ctx = {
                "certfile": options.ssl_cert,
                "keyfile": options.ssl_key,
            }
        else:
            ctx = None
    
        container = tornado.wsgi.WSGIContainer(app)
        http_server = tornado.httpserver.HTTPServer(container, 
            ssl_options=ctx)
        http_server.listen(options.port, address=options.hostname)
        loop=tornado.ioloop.IOLoop.instance()
        if options.reload:
            for f in extra_files:
                tornado.autoreload.watch(f)
            tornado.autoreload.start(loop)
        loop.start()

如果需要启动ssl支持,则根据命令行参数(如果没提供则使用缺省的文件名)来生成ssl相关的配置信息。HTTPServer有一个参数是接收ssl的信息的,缺省为None。

使用tornado来跑wsgi的应用,需要使用 wsgi.WSGIContainer 类,wsgi application对应作为参数传进去,它会得到一个对象, 这个对象可以传递给HTTPServer类。

在listen时,可以传入命令行的端口及IP地址。

为了支持reload,需要先创建IOLoop的实例,然后执行 autoreload.start(loop) 。缺省情况下,tonado只处理导入的模块,为了监听象配置文件的变化,可以调用 autoreload.watch(filename) 方法来添加额外的文件名。这里extra_files是uliweb原来就生成好的,主要是配置文件,可以直接拿过来用。

处理好reload之后,启动服务即可。

经过上面的努力,在开发时,可以直接使用tornado来启动uliweb应用了。

生产部署对tornado的支持

如果在生产上想使用tornado来跑uliweb,那可以执行:

uliweb support tornado

这样会在当前的项目目录下拷贝一个叫tornado_handler.py的文件,可以直接用它来运行。它支持 -p port-h host 参数。缺省为 8000 和 127.0.0.1。