Tornado学习小结

概述

它是非阻塞式服务器,而且性能十分优越,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个理想框架,专门解决C10K问题。

模块

主要模块

  • tornado.web:包含了大多数重要的功能
  • tornado.escape: XHTML、JSON、URL的编码解码方法
  • database: 对Mysql的简单封装
  • template:web模板系统
  • httpclient:非阻塞式 HTTP 客户端,它被设计用来和 web 及 httpserver 协同工作
  • auth:第三方认证的实现(包括 Google OpenID/OAuth、Facebook Platform、Yahoo BBAuth、FriendFeed OpenID/OAuth、Twitter OAuth)
  • local:针对本地化和翻译的支持
  • options:命令行和配置文件解析工具,针对服务器环境做了优化

底层模块:

  • httpserver:服务于 web 模块的一个非常简单的 HTTP 服务器的实现
  • iostream:对非阻塞式的 socket的简单封装,以方便常用读写操作
  • ioloop:核心的I/O循环

代码中学习Tornado的基本功能

helloTornado展示Tornado最频繁使用的功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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()

$ curl http://localhost:8000/
Hello, friendly user!
$ curl http://localhost:8000/?greeting=Salutations
Salutations, friendly user!

除了get方法,来尝试一下post方法!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import textwrap

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 ReverseHandler(tornado.web.RequestHandler):
def get(self, input):
self.write(input[::-1])

class WrapHandler(tornado.web.RequestHandler):
def post(self):
text = self.get_argument('text')
width = self.get_argument('width', 40)
self.write(textwrap.fill(text, int(width)))

if __name__ == "__main__":
tornado.options.parse_command_line()
app = tornado.web.Application(
handlers=[
(r"/reverse/(\w+)", ReverseHandler),
(r"/wrap", WrapHandler)
]
)
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()

$ http://localhost:8000/reverse/slipup
pupils
$ http://localhost:8000/wrap -d text=Lorem+ipsum+dolor+sit+amet,+consectetuer+adipiscing+elit.
Lorem ipsum dolor sit amet, consectetuer adipiscing elit.

修改用户名代码示例:

1
2
3
4
5
6
7
8
9
10
11
# matched with (r"/widget/(\d+)", WidgetHandler)
# widget:小机械,小部件
class WidgetHandler(tornado.web.RequestHandler):
def get(self, widget_id):
widget = retrieve_from_db(widget_id)
self.write(widget.serialize())

def post(self, widget_id):
widget = retrieve_from_db(widget_id)
widget['foo'] = self.get_argument('foo')
save_to_db(widget)

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)响应码。
请zzy824喝杯咖啡
0%