tornado 源码包中 demos 目录下包含一些示例程序,就从最简单的 helloworld.py 来看一个 tornado 应用程序的代码结构。
完整的实例程序如下:
01 |
#!/usr/bin/env python |
02 |
# |
03 |
# Copyright 2009 Facebook |
04 |
# |
05 |
06 |
import tornado.httpserver |
07 |
import tornado.ioloop |
08 |
import tornado.options |
09 |
import tornado.web |
10 |
11 |
from tornado.options import define, options |
12 |
13 |
define( "port" , default = 8888 , help = "run on the given port" , type = int ) |
14 |
15 |
16 |
class MainHandler(tornado.web.RequestHandler): |
17 |
def get( self ): |
18 |
self .write( "Hello, Nowamagic" ) |
19 |
20 |
21 |
def main(): |
22 |
tornado.options.parse_command_line() |
23 |
application = tornado.web.Application([ |
24 |
(r "/" , MainHandler), |
25 |
]) |
26 |
http_server = tornado.httpserver.HTTPServer(application) |
27 |
http_server.listen(options.port) |
28 |
tornado.ioloop.IOLoop.instance().start() |
29 |
30 |
31 |
if __name__ = = "__main__" : |
32 |
main() |
首先是一组 import。这个再正常不过了,当然,之前该有的注释什么的还是要有的。
1 |
import tornado.httpserver |
2 |
import tornado.ioloop |
3 |
import tornado.options |
4 |
import tornado.web |
5 |
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): |
2 |
def get( self ): |
3 |
self .write( "Hello, Nowamagic" ) |
XXHandler 针对映射的 url 的具体实现。
Handler 下面是 main() 函数的定义:
1 |
def main(): |
2 |
tornado.options.parse_command_line() |
3 |
application = tornado.web.Application([ |
4 |
(r "/" , MainHandler), |
5 |
]) |
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 工作。当然,具体的实现还是比较复杂的,这里仅仅是简单概括一下。
总结下来,代码组织如下:
1 |
注释 |
2 |
import 语句 |
3 |
选项参数定义 |
4 |
Application定义 |
5 |
BaseHandler定义 |
6 |
XXHandlers定义 |
7 |
main()定义 |