Why Tornado?
在过去的五年里,Web开发人员的可用工具实现了跨越式地增长。当技术专家不断推动极限,使Web应用无处不在时,我们也不得不升级我们的工具、创建框架以保证构建更好的应用。我们希望能够使用新的工具,方便我们写出更加整洁、可维护的代码,使部署到世界各地的用户时拥有高效的可扩展性。
这就让我们谈论到Tornado,一个编写易创建、扩展和部署的强力Web应用的梦幻选择。我们三个都因为Tornado的速度、简单和可扩展性而深深地爱上了它,在一些个人项目中尝试之后,我们将其运用到日常工作中。我们已经看到,Tornado在很多大型或小型的项目中提升了开发者的速度(和乐趣!),同时,其鲁棒性和轻量级也给开发者一次又一次留下了深刻的印象。
Install Tornado!
安装有多难?一个命令搞定,无需多余配置。
pip install tornado
《Hello Tornado》
Tornado是一个编写对HTTP请求响应的框架。作为程序员,你的工作是编写响应特定条件HTTP请求的响应的handler。下面是一个全功能的Tornado应用的基础示例:
基本代码
# coding:utf-8
import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
from tornado.options import define, options
define("port", default=3333, help="run on the given port", type=int)
class IndexHandler(tornado.web.RequestHandler):
def get(self):
username = self.get_argument('username', 'Hello')
self.write(username + ', Administrator User!')
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
python hello.py --port=3333
访问Tornado
在浏览器中打开http://localhost:3333
即可访问成功。
又或者打开另一个终端窗口使用curl访问
$ curl http://localhost:3333/
Hello, Administrator User!
$ curl http://localhost:3333/?username=blog.csdn.net/moshowgame
blog.csdn.net/moshowgame, Administrator User!
代码解析
from tornado.options import define, options define(“port”,
default=8000, help=“run on the given port”, type=int)
在程序的最顶部,我们导入了一些Tornado模块。虽然Tornado还有另外一些有用的模块,但在这个例子中我们必须至少包含这四个模块。
Tornado包括了一个有用的模块(tornado.options)来从命令行中读取设置。我们在这里使用这个模块指定我们的应用监听HTTP请求的端口。它的工作流程如下:如果一个与define语句中同名的设置在命令行中被给出,那么它将成为全局options的一个属性。如果用户运行程序时使用了–help选项,程序将打印出所有你定义的选项以及你在define函数的help参数中指定的文本。
如果用户没有为这个选项指定值,则使用default的值进行代替。Tornado使用type参数进行基本的参数类型验证,当不合适的类型被给出时抛出一个异常。因此,我们允许一个整数的port参数作为options.port来访问程序。如果用户没有指定值python hello.py --port=3333
,则默认为8000。
class IndexHandler(tornado.web.RequestHandler):
def get(self):
username = self.get_argument(‘username’, ‘Hello’)
self.write(username + ‘, Administrator User!’)
这是Tornado的Handler请求处理函数类
。当处理一个请求时,Tornado将这个类实例化,并调用与HTTP请求方法所对应的方法。在这个例子中,我们只定义了一个get方法,也就是说这个处理函数将对HTTP的GET请求
作出响应。
greeting = self.get_argument(’
username
’, ‘Hello’)
Tornado的RequestHandler类有一系列有用的内建方法,包括get_argument
,我们在这里从一个查询字符串中取得参数username
的值。(如果这个参数没有出现在查询字符串中,Tornado将使用get_argument的第二个参数作为默认值。)
self.write(username + ‘, Administrator User!’)
RequestHandler的另一个有用的方法是write
,它以一个字符串作为函数的参数,并将其写入到HTTP响应中。在这里,我们使用请求中username参数
提供的值绑定到username变量
中,并写回到响应中。
if name == “main”:
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/", IndexHandler)])
这是真正使得Tornado运转起来的语句。首先,我们使用Tornado的options模块来解析命令行。然后我们创建了一个Tornado的Application类的实例。传递给Application类__init__
方法的最重要的参数是handlers
。它告诉Tornado应该用哪个类来响应请求。马上我们讲解更多相关知识。
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
从这里开始的代码将会被反复使用:一旦Application对象被创建,我们可以将其传递给Tornado的HTTPServer
对象,然后使用我们在命令行指定的端口进行监听(通过options对象取出。)最后,在程序准备好接收HTTP请求后,我们创建一个Tornado
的IOLoop
的实例。