Tornado的支持¶
开发服务器的tornado支持¶
目前uliweb在启动开发服务器时,可以通过:
uliweb runserver --tornado
来启动tornado,并用它来跑uliweb应用。同时还支持reload和ssl。
那么我是如何实现的,在这里描述一下:
修改 manage.py 下的 RunserverCommand 类:
- 増加
--tornado
选项支持 増加对 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。