tornado 源码包中 demos 目录下包含一些示例程序,就从最简单的 helloworld.py 来看一个 tornado 应用程序的代码结构。
完整的实例程序如下:
06 | import tornado.httpserver |
08 | import tornado.options |
11 | from tornado.options import define, options |
13 | define( "port" , default = 8888 , help = "run on the given port" , type = int ) |
16 | class MainHandler(tornado.web.RequestHandler): |
18 | self .write( "Hello, Nowamagic" ) |
22 | tornado.options.parse_command_line() |
23 | application = tornado.web.Application([ |
26 | http_server = tornado.httpserver.HTTPServer(application) |
27 | http_server.listen(options.port) |
28 | tornado.ioloop.IOLoop.instance().start() |
31 | if __name__ = = "__main__" : |
首先是一组 import。这个再正常不过了,当然,之前该有的注释什么的还是要有的。
1 | import tornado.httpserver |
6 | from tornado.options import define, options |
接下来,是定义应用程序的选项,这样可以在启动应用程序的时候指定一些参数。tornado 提供了方法 tornado.options.define 来简化了选项参数的定义,具体的可以通过 help 来查看。这里有直接的例子,定义端口参数:
1 | define( "port" , default = 8888 , help = "run on the given port" , type = int ) |
接下来是 MainHandler 的设置:
1 | class MainHandler(tornado.web.RequestHandler): |
3 | self .write( "Hello, Nowamagic" ) |
XXHandler 针对映射的 url 的具体实现。
Handler 下面是 main() 函数的定义:
2 | tornado.options.parse_command_line() |
3 | application = tornado.web.Application([ |
6 | http_server = tornado.httpserver.HTTPServer(application) |
7 | http_server.listen(options.port) |
8 | tornado.ioloop.IOLoop.instance().start() |
应用程序执行时,会先解析选择参数。之后创建一个 Application 实例并传递给 HTTPServer 实例,之后启动这个实例,到此,http server 启动了。tornado.httpserver 模块用来支持非阻塞的 HTTP Server。
启动服务器之后,还需要启动 IOLoop 的实例,这样可以启动事件循环机制,配合非阻塞的 HTTP Server 工作。当然,具体的实现还是比较复杂的,这里仅仅是简单概括一下。
总结下来,代码组织如下: