tornado(一):引言

一、安装tornado

Unix环境:

$ curl -L -O https://github.com/facebook/tornado/archive/v3.1.0.tar.gz
$ tar xvzf v3.1.0.tar.gz
$ cd tornado-3.1.0
$ python setup.py build
$ sudo python setup.py install

Windows环境:

Tornado官方并不支持Windows,但你可以通过ActivePython的PyPM包管理器进行安装,类似如下所示:

C:\> pypm install tornado
二、支持

一般指南、示例,tornado官网:http://tornadoweb.org/
变更等细节,tornado在github的地址:http://github.com/facebook/tornado

更具体的问题,Tornado的Google Group,众多的tornado开发者:http://groups.google.com/group/python-tornado

 三、一个简单的web服务示例

代码清单1-1  基础:hello.py
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):
        greeting = self.get_argument('greeting', 'Hello')
        self.write(greeting + ', friendly 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()

测试:

你可以在命令行里尝试运行这个程序以测试输出:

$ python hello.py --port=8000

现在你可以在浏览器中打开http://localhost:8000,或者打开另一个终端窗口使用curl测试我们的应用:

$ 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 import define, options
define("port", default=8000, help="run on the given port", type=int)
tornado.options,从命令行中读取设置。在这里使用这个模块,指定我们的应用监听HTTP请求的端口。
它的工作流程如下:如果一个与define语句中同名的设置在命令行中被给出,那么它将成为全局options的一个属性。
如果用户运行程序时使用了--help选项,程序将打印出所有你定义的选项以及你在define函数的help参数中指定的文本。
如果用户没有为这个选项指定值,则使用default的值进行代替。
Tornado使用type参数进行基本的参数类型验证,当不合适的类型被给出时抛出一个异常。
因此,我们允许一个整数的port参数作为options.port来访问程序。如果用户没有指定值,则默认为8000。

class IndexHandler(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的web的RequestHandler类有一系列有用的内建方法,包括get_argument,我们在这里从一个查询字符串中取得参数greeting的值。
(如果这个参数没有出现在查询字符串中,Tornado将使用get_argument的第二个参数作为默认值。)

self.write(greeting + ', friendly user!')
RequestHandler的另一个有用的方法是write,它以一个字符串作为函数的参数,并将其写入到HTTP响应中。
在这里,我们使用请求中greeting参数提供的值插入到greeting中,并写回到响应中。
 
if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers=[(r"/", IndexHandler)])

这是真正使得Tornado运转起来的语句。首先,我们使用Tornado的options模块来解析命令行。

然后我们创建了一个Tornado的web的Application类的实例。传递给Application__init__方法的最重要的参数是handlers。它告诉Tornado应该用哪个类来响应请求。它是一个元组组成的列表。

RequestHandler对象:如何从一个传入的HTTP请求中获得信息(使用get_argument和传入到getpost的参数)以及写HTTP响应(使用write方法)。

 

http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

从这里开始的代码将会被反复使用:一旦Application对象被创建,我们可以将其传递给Tornado的HTTPServer对象,然后使用我们在命令行指定的端口进行监听(通过options对象取出。)最后,在程序准备好接收HTTP请求后,我们创建一个Tornado的IOLoop的实例。

 

 HTTP状态码:

使用RequestHandler类的set_status()方法可以显式地设置HTTP状态码。在某些情况下,Tornado会自动地设置HTTP状态码。下面是一个常用情况的纲要:

404 Not Found

Tornado会在HTTP请求的路径无法匹配任何RequestHandler类相对应的模式时返回404(Not Found)响应码。

400 Bad Request

如果你调用了一个没有默认值的get_argument函数,并且没有发现给定名称的参数,Tornado将自动返回一个400(Bad Request)响应码。

405 Method Not Allowed

如果传入的请求使用了RequestHandler中没有定义的HTTP方法(比如,一个POST请求,但是处理函数中只有定义了get方法),Tornado将返回一个405(Methos Not Allowed)响应码。

500 Internal Server Error

当程序遇到任何不能让其退出的错误时,Tornado将返回500(Internal Server Error)响应码。你代码中任何没有捕获的异常也会导致500响应码。

200 OK

如果响应成功,并且没有其他返回码被设置,Tornado将默认返回一个200(OK)响应码。                

当上述任何一种错误发生时,Tornado将默认向客户端发送一个包含状态码和错误信息的简短片段。如果你想使用自己的方法代替默认的错误响应,你可以重写write_error方法在你的RequestHandler类中。

比如,代码清单1-3是hello.py示例添加了常规的错误消息的版本。

 

posted on 2017-08-07 20:25  myworldworld  阅读(137)  评论(0)    收藏  举报

导航