Python开源Web框架Tornado学习笔记

TornadoFriendFeed使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本,能让python web服务器搭建变得更加简单快捷。

相关资料

这里是中文帮助文档。
这里是项目GitHub地址。
这里是一个很好的教程

环境搭建

1.下载安装release下载页

1
2
3
4
tar xvzf tornado-1.2.1.tar.gz
cd tornado-1.2.1
python setup.py build
sudo python setup.py install

2.通过 pip 或者 easy_install 来安装,如:

  • 使用pip安装命令,如果安装失败运行时引包会报错

    1
    sudo pip install tornado
  • 但前提是机器里安装了pip,如果没有的话先安装pip再说:

    1
    sudo apt-get install python-pip
  • pip卸载/更新命令:

    1
    2
    sudo pip uninstall tornado
    sudo pip install --upgrade tornado

编写代码

编写Python代码比较习惯使用Jetbrains公司的PyCharm,获取注册码可参考http://idea.qinxi1992.cn/

GitHub上源代码里包含了示例代码

HelloWorld代码:

访问http://localhost:8888/ 就可以在浏览器打印出Hello, world

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import tornado.ioloop
import tornado.web


class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")


def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])


if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()

使用Tornado的程序结构清晰易懂,程序定义了一个类,一个函数,一些全局代码

1
if __name__ == "__main__":

这里是代码执行的入口,这个判断语句判断该模块是否是主模块,里面一般写一些对该模块的测试代码,只有把该模块作为主模块执行的时候,才运行这些测试代码,否则当它作为类库被其他模块引用时,就不必手动来注释这些测试代码了。
普通Tornado程序的执行,就是一个tornado.web.Application对象通过listen()监听一个端口,在使用tornado.ioloop.IOLoop.current().start()开启IOLoop。

Handler与请求映射

光有监听,没有指定服务器接受请求后的操作,也不能完成请求,Tornado通过继承tornado.web.RequestHandler,重写get(), post()等方法来指定相应的操作,Handler数组作为Application构造参数与之关联。
因此一个Application可以有多个Handler,对应不同的次级url,例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class FirstHandler(tornado.web.RequestHandler):
def get(self):
self.write("FirstHandler")

class SecondHandler(tornado.web.RequestHandler):
def get(self):
self.write("SecondHandler")


def make_app():
return tornado.web.Application([
(r"/first", FirstHandler),
(r"/second", SecondHandler),
])

定义了两个Handler类,在Application构造方法参数中如(r”/first”, FirstHandler)指定子URL /first对应到FirstHandler,字符串”/first”前面的r作用是声明字符串中的所有字符不做转义操作,因此通过访问http://localhost:8888/firsthttp://localhost:8888/second 可以映射到不同的操作。

也可以使用通配符,这时匹配的参数还会作为参数传递到Handler请求中

1
2
3
4
5
6
7
8
9
class MainHandler(tornado.web.RequestHandler):
def get(self, arg):
self.write("Page" + arg)


def make_app():
return tornado.web.Application([
(r"/page/([0-9]+)", MainHandler),
])

这时访问http://localhost:8888/page/789 ,页面打印出Page789。但如果传入不匹配的url如http://localhost:8888/page/789aa ,将会返回404错误。
如此以后,如果网站需要增加一个页面或模块,只需要在项目中添加对应的Handler并注册即可。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器