一、安装 Tornado
目前最新版本的下载: http://github.com/downloads/facebook/tornado/tornado-1.2.1.tar.gz
解压之后,进入解压的目录,执行:
python setup.py build
python setup.py install
如果开发环境是py2.6+,也可以简单的把tornado目录添加到py的环境变量 PYTHONPATH 中,这样就不需要编译setup.py(也就是不用安装的意思)
安装条件:
在py2.5 2.6 2.7上进行过测试,如果要使用 tornado 的全部功能,必须安装 PycURL (版本7.18.2 或者以上),对py2.5必须安装JSON支持组件simplejson,py2.6+以上的JSON支持已经在标准库内实现。
二、模块列表和简介:
最重要的模块是web模块,他作为web框架包含了 Tornado 包内大部分的有用的东西,其他的工具和模块让web变的更有用
主模块
web – 用来创建FriendFeed的web框架,他集成(混合)了大部分 Tornado 的重要功能特征
escape – XHTML, JSON, and URL 编解码方法
database -对MySQLdb的简单封装,让mysql的使用更方便
template – 基于python的模板渲染语言
httpclient – 一个非阻塞http客户端,设计它用来和web和httpserver协同工作
auth – 第三方认证和认证方案的实现 (Google OpenID/OAuth, Facebook Platform, Yahoo BBAuth, FriendFeed OpenID/OAuth, Twitter OAuth)
locale – 本地化和翻译支持
options – 命令行和配置文件解析工具,为了webserver环境做了优化
底层模块
httpserver – A very simple HTTP server built on which web is built
iostream – A simple wrapper around non-blocking sockets to aide common reading and writing patterns
ioloop – Core I/O loop
随机模块:
s3server – 一个实现了Amazon S3接口的web服务器,基于本地文件存储
三、Tornado使用概览
一个 Tornado 应用会把URL或者URL模式映射到 tornado.web.RequestHandler 的子类,这些子类定义 get 和 set 方法来处理对应URL的GET和POST请求。
http://www.yaozinan.com/2011/04/tornado%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E/?replytocom=15
==== 范例1 ==================================================
import tornado
import tornado.httpserver
import tornado.ioloop
import tornado.web
import os.path
# 申明一个 add 函数,提供给模板文件使用
def add(x, y):
return (x+y)
# 网页访问处理
class MainHandler(tornado.web.RequestHandler):
def get(self):
items = ["item1","item2","item3", '222']
# 第一个参数是模板文件,后面不但可以传递参数,还可以传递函数,可扩展性很好而且很强大。
self.render("templates.html", items=items, add=add)
class StoryHandler(tornado.web.RequestHandler):
def post(self, story_id):
self.set_header("Content-Type", "text/plain") # 设置头部信息
self.write("You wrote " + self.get_argument("message")) # get_argument方法接收参数
# 不使用模板,则可直接把内容 write 出去
self.write("You requested the story " + story_id)
# 可以多次调用 write,把要显示的内容追加上去
self.write("<input type='button' value='返回' οnclick='window.history.back();'/>")
# 更多的访问处理方式
class IndexHandler(tornado.web.RequestHandler):
# 处理post过来的数据,接收 service_method, argv 两个URL参数
def post(self, service_method='', argv=''):
print('method:POST...')
print('service_method:' + service_method)
# 参数处理,按斜杠划分成list
if argv:
if argv.startswith('/'): argv = argv[1:]
if argv.endswith('/'): argv = argv[:-1]
argv = argv.split('/') if argv else []
print('argv:' + str(argv))
print('request.arguments:' + str(self.request.arguments)) # form 表单提交的信息
print('application:' + str(self.application))
items = ["item1","item2","item3", 'dfsdfsd']
self.render("templates.html", items=items, add=add)
# 处理get提交过来的数据
def get(self, service_method='', argv=''):
print('method:GET....')
self.post(service_method, argv)
# post 和 get 处理之后的调用; data 是处理模板后的内容,string类型,调用self.write或者什么都不显示时为None
def finish(self, data=None):
print('finish data:\n' + str(data))
super(IndexHandler, self).finish(data)
# 找不到页面的处理
class NotFoundHandler(tornado.web.RequestHandler):
def prepare(self):
NOTFOUND_404 = "404.html" # 404文件地址
if os.path.exists(NOTFOUND_404):
#self.set_status(404) # 设 404 状态,浏览器可能会跳转到自己定义的找不到页面,要想全部显示一样就不要设置此状态
self.render(NOTFOUND_404, url = self.request.full_url())
else:
self.send_error(404)
# 网址访问的配置
application = tornado.web.Application([
(r"/", MainHandler),
(r"/story/([0-9]+)", StoryHandler),
(r'^/index/(?P<service_method>.*?)(?P<argv>/.*?)?', IndexHandler), # service_method, argv 两个URL参数可传递给函数处理
(r"/.*", NotFoundHandler), # 找不到页面,必须放在最后
])
if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application) # 加载配置
http_server.listen(8088) # 监听端口号
tornado.ioloop.IOLoop.instance().start() # 启动
# 测试网址:
# http://localhost:8088/
# http://127.0.0.1:8088/story/555
# http://127.0.0.1:8088/index/test/test2/kkkk