Tornado是使用Python编写的一个强大的、可扩展的Web服务器。它在处理严峻的网络流量时表现得足够强健,但却在建立和编写时有着足够的轻量级,并可以被用在大量的应用和工具中。python
首先是安装tornado. tornado不支持windows。若是须要在windows下安装能够经过ActivePython的PyPM包管理器进行安装相似:pypm install tornadolinux
在linux下安装就简单多了。pip install tornado就能够了web
下面咱们进入tornado的功能。首先来看一个基本的web应用,在给定的端口上监听请求,并在根目录”/”响应请求django
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define,options
define("port",default=8000,help="run on the given port",type=int)
class indexHandler(tornado.web.RequestHandler):
def get(self, *args, **kwargs):
greeting=self.get_argument('greeting','hello')
self.write(greeting+'tornado user')
def server_function():
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/", indexHandler),(r"/index",indexHandler)])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port,address='127.0.0.1')
tornado.ioloop.IOLoop.instance().start()
在终端执行:windows
zhf@zhf-maple:~/py_prj$ python tornada_try.py浏览器
而后在浏览器输入http://localhost:8000/服务器
此时在终端上能够看到对应的输出。网络
zhf@zhf-maple:~/py_prj$ python tornada_try.pyapp
[I 171204 10:53:23 web:2063] 200 GET / (127.0.0.1) 0.49ms函数
[W 171204 10:53:23 web:2063] 404 GET /favicon.ico (127.0.0.1) 0.40ms
下面来介绍下上面应用的各个模块:
首先看下options功能。在运行代码的时候会设置端口和地址等参数。python自带有argparse模块进行参数解析。tornado中不须要调用argparse模块而是自带了options模块。下面是测试代码:
import tornado.options
from tornado.options import options
if __name__=="__main__":
tornado.options.parse_command_line()
print options.port
终端执行脚本:
zhf@zhf-maple:~/py_prj$ python tornada_try.py --port=8001
8001
若是加入了不存在的参数会报以下的错误
zhf@zhf-maple:~/py_prj$ python tornada_try.py --addr=127.0.0.1
tornado.options.Error: Unrecognized command line option: 'addr
也能够不带参数,经过define来设置默认参数。以下。port表明新增长的参数名称
default表明默认值,help表明帮助信息,当使用--help的时候会打印help的字段。type表明了前面新加参数的类型。
from tornado.options import define
define("port",default=9000,help="run on the given port",type=int)
from tornado.options import define
define("port",default=9000,help="run on the given port",type=int)
运行结果以下:
zhf@zhf-maple:~/py_prj$ python tornada_try.py
9000
zhf@zhf-maple:~/py_prj$ python tornada_try.py --help
tornada_try.py options:
--port run on the given port (default 9000)
IndexHandler:这个类继承于tornado.web.RequestHandler。每当网页发起一个请求的时候,Tornadah会调用这个类并将其实例化。而后调用HTTP请求所对应的方法。也就是get方法,这个处理函数将对HTTP的GET请求做出响应。
在get方法中调用了get_argument方法。这个函数的做用是增长参数greeting,并初始化为hello。在后面的write方法调用。
write方法:这个参数的做用是生成HTTP response的具体信息。在这里里面的参数是greeting+“tornado user”, 所以在网页中生成的信息是hellotornado user
Application: 这是tornado运转起来的语句,tornado.web.Application(handlers=[(r"/", IndexHandler)])建立了一个Application实例,传递给Application的__init__函数最重要的是参数是handler,也就是[(r"/", IndexHandler)]。 handler告诉tornado该 用哪一个类来响应请求。
最后是服务器的启动:listen方法监听端口和地址。ioloop方法循环执行server监听功能。
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port,address='127.0.0.1')
tornado.ioloop.IOLoop.instance().start()
咱们来具体看下handler参数的用法。这个handler参数是一元组组成的列表。其中元组第一个参数表明的是网页访问路径,第二个是该访问路径的触发实例
tornado.web.Application(handlers=[(r"/", indexHandler)]}
在前面的运行中,在网页中输入http://localhost:8000/能够获得打印的字符串。可是若是咱们输入http://localhost:8000/index则会提示404:Not Found.提示找不到对应的网页。缘由在于咱们在handlers中并无添加/index的处理方法。这就至关与django中的路由机制:
url(r'index/',views.index) /index对应的处理函数是views.index
那么若是咱们要访问index这个网页路径,也须要在handers中添加对应的路由机制。这样当输入http://localhost:8000/index 也会调用indexHandler实例
tornado.web.Application(handlers=[(r"/", indexHandler),(r"/index",indexHandler)]
另外在indexHandler中咱们只定义了get方法。在网页中传递数据有get和post两种方法。若是网页采用的是post的方法,那么一样的在indexHandler中须要定义post函数,用法和get函数是同样的。