1. Tornado 是什么?
2. 在ubuntu下安装Tornado并测试官网给出的HelloWorld程序
在tornado-3.1目录中有一个demos文件夹,进入demos,其中有一个helloworld文件夹,里面只有一个python脚本helloworld.py,
Tornado是一个强大而可伸缩的web服务器,用Python语言开发而成。虽然是轻量级的,但是他很健壮,可以应用于正式的多种应用和工具。
Tornado是基于一个叫公司FriendFeed开发的web框架,起初由Bret Taylor等人开发的,后来,在他们要求下,代码开源了。商业的web框架最多可以同时具有10000个连接,而Tornado开发目标是解决大规模并发网络(C10K Problem)问题的高性能web框架。它还包括了安全处理、用户认证、社交网络、异步模式及数据库、web接口函数的扩展服务。
自2009年10月发布以来,获得许多团体支持,并被应用于各种不同的目标。除了FriendFeed和Facebook之外,很多公司在生产中开始转向Tornado,包括Quora、Turntable.fm、 Bit.ly、Hipmunk和 MyYearbook。
简单地说,如果你正在寻求大型CMS或大而慢的开发框架,Tornado不会是你的选择。Tornado并不要求你以特别的形式建立大型模型或一定风格的处理形式。你可以做到敏捷开发。你要创建可伸缩而友好的应用、实时的分析引擎或RESTful API,用这个框架是很好的选择。
Tornado起步
在类Linux系统中安装很容易,可以用PyPI获取,也可以从Github下载源代码,用以下命令安装:
$ curl -L -Ohttp://github.com/downloads/facebook/tornado/tornado-2.1.1.tar.gz
$ tar xvzf tornado-2.1.1.tar.gz
$ cd tornado-2.1.1
$ python setup.py build
$ sudo python setup.py install
它没有windows系统的官方支持,但可以通过ActivePython的PyPM包管理器安装:
C:\> pypm install tornado
安装时,会带有演示模块。它包括建立博客、集成用来运行聊天服务的Facebook等。后面章节将一步一步地讲解一些例子。
简易web服务器
前文已经简单介绍了Tornado,下面将开始如何用Tornado写一个基础的web服务器。
Hello Tornado实例
Tornado是个可以用来写HTTP请求应答的框架。作为程序员,你需要编写匹配一个特别形式的HTTP请求应答。以下是一个全功能Tornado应用实例程序:
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options importdefine, options
define("port",default=8000, help="run on the given port", type=int)
class IndexHandler(tornado.web.RequestHandler):
def get(self):
greeting =self.get_argument('greeting', 'Hello')
self.write(greeting + ', friendlyuser!')
if __name__ =="__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
写Tornado应用基本工作就是定义RequestHandler的子类。本例中,我们编写了一个简单的侦听给定端口号并应答根请求的应用。
而后在命令行下输入以下命令来测试:
$ python hello.py --port=8000
现在在浏览器中浏览http://localhost:8000/地址,或再开一个终端窗口来测试:
$ curl http://localhost:8000/
Hello, friendly user!
$ curl http://localhost:8000/?greeting=Salutations
Salutations, friendly user!
下面分代码块一句一句分析:
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
程序开始,导入多个Tornado助手库。其中,还包括有其它的一些包,但至少需要导入以下四个才能使本演示实例运行:
from tornado.options importdefine, options
define("port",default=8000, help="run on the given port", type=int)
为读取命令行参数,Tornado包中含有助手库(tornado.options)。本例中使用它可以让我们特别指定HTTP服务端口。它是这样工作的:在define语句中给出选项参数会成为全局options对象,否则选项参数在命令行中以相同的名字给出。如果用户带--help参数运行程序,程序会输出定义的所有选项提示。如果用户没有提供我们定义参数的值,默认值会自动应用。Tornado用type参数做参数类型检查,如果类型错误,会抛出一个错误。本例中允许用户使用整数类型的port参数,我们也可以在程序中以options.port形式给出。如果用户没有指定,其默认值为8000。
classIndexHandler(tornado.web.RequestHandler):
def get(self):
greeting =self.get_argument('greeting', 'Hello')
self.write(greeting + ',friendly user!')
这是一个Tornado请求处理类。当处理请求时,Tornado实例化这个类并调用对应的HTTP请求的方法。本例中,我们只定义了一个get方法,意思是这个处理器将回应HTTP GET请求。我们在后在部分会看到更多HTTP方法接口。
greeting =self.get_argument('greeting', 'Hello')
Tornado请求处理器类拥有许多有用的内建方法,其中包括get_argument,在这里用它来从HTTP请求参数中获取greeting参数,而Hello字符串作为默认值。
self.write(greeting + ', friendlyuser!')
Tornado请求处理类另一个方法是write,他获取一个字符串参数并写入到HTTP应答中去。在这里,我们使用请求参数中的greeting参数,并输出到应答中。
if __name__ =="__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
以上几行用于运行Tornado应用程序。首先,我们使用Tornado options库分析命令行。然后创建Application类的实例。传给Application类 __init__方法最重要的参数是handlers。它指出哪个类用来处理哪个请求。
http_server =tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
以上代码是一个模板式内容,传入一个Application对象给Tornado的HTTPServer对象,它会监听我们在命令行在指出的端口(否则使用默认端口)。最后,我们创建Tornado的IOLoop的实例,之后会指出程序准备好接收HTTP请求。
handlers参数
再看一下hello.py中的这一行:
app =tornado.web.Application(handlers=[(r"/", IndexHandler)])
这个参数很重要,值得仔细进步研究。它必须是一个元组的列表,其中每个元组第一个元素是正则式,第二个元素是一个RequestHandler类。在hello.py中,我们只给出了一对,你可以根据需要给出更多。
用正则指示特殊的地址
Tornado使用正则来匹配HTTP请求地址,它会自动把其中的正则表达包括在开始和结束正则符号中(例如'/'约定为'^/$')
当正则表达式中有捕获组时,组匹配内容会作为参数传给RequestHandler对象中的对应HTTP请求的方法。
C, Erlang, Java, Go 语言的Web Server 性能测试
知乎为什么选择 Tornado 作为 Web 开发框架?
http://www.zhihu.com/question/19574244