Tornado就是我们在 FriendFeed 的 Web 服务器及其常用工具的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对epoll的运用,Tornado 每秒可以处理数以千计的连接,因此 Tornado 是实时 Web 服务的一个 理想框架。我们开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每一个活动用户都会保持着一个服务器连接。
Tornado的安装:
手动安装: 下载 tornado-2.0.tar.gz
tar xvzf tornado-2.0.tar.gz
cd tornado-2.0
python setup.py build
sudo python setup.py install
Tornado 的代码托管在 GitHub 上面。对于 Python 2.6 以上的版本,因为标准库中已经包括了对 epoll
的支持,所以你可以不用 setup.py
编译安装,只要简单地将 tornado 的目录添加到 PYTHONPATH
就可以使用了。当然在安装Torando之前你需要安装PycURL以及simplejson。
主要模块
web
- FriendFeed 使用的基础 Web 框架,包含了 Tornado 的大多数重要的功能escape
- XHTML, JSON, URL 的编码/解码方法database
- 对MySQLdb
的简单封装,使其更容易使用template
- 基于 Python 的 web 模板系统httpclient
- 非阻塞式 HTTP 客户端,它被设计用来和web
及httpserver
协同工作auth
- 第三方认证的实现(包括 Google OpenID/OAuth、Facebook Platform、Yahoo BBAuth、FriendFeed OpenID/OAuth、Twitter OAuth)locale
- 针对本地化和翻译的支持options
- 命令行和配置文件解析工具,针对服务器环境做了优化
底层模块
httpserver
- 服务于web
模块的一个非常简单的 HTTP 服务器的实现iostream
- 对非阻塞式的 socket 的简单封装,以方便常用读写操作ioloop
- 核心的 I/O 循环
Tornado 的 Web 程序会将 URL 或者 URL 范式映射到 tornado.web.RequestHandler
的子类上去。在其子类中定义了get()
或 post()
方法,用以处理不同的 HTTP 请求。
下面的代码将 URL 根目录 /
映射到 MainHandler
,还将一个 URL 范式 /story/([0-9]+)
映射到 StoryHandler
。正则表达式匹配的分组会作为参数引入 的相应方法中:
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("You requested the main page")
class StoryHandler(tornado.web.RequestHandler):
def get(self, story_id):
self.write("You requested the story " + story_id)
application = tornado.web.Application([
(r"/", MainHandler),
(r"/story/([0-9]+)", StoryHandler),
])