Tornado
参考: http://www.cnblogs.com/wupeiqi/articles/5702910.html
Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本。这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具 和优化。
Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。 开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每一个活动用户都会保持着一个服务器连接。
快速上手(比django简化的多)
import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") application = tornado.web.Application([ (r"/index", MainHandler), ]) if __name__ == "__main__": application.listen(8888) tornado.ioloop.IOLoop.instance().start()
第一步:执行脚本,监听 8888 端口
第二步:浏览器客户端访问 /index --> http://127.0.0.1:8888/index
第三步:服务器接受请求,并交由对应的类处理该请求
第四步:类接受到请求之后,根据请求方式(post / get / delete ...)的不同调用并执行相应的方法
第五步:方法返回值的字符串内容发送浏览器
上面是最简单的用法,但实际中我们的程序比较复杂,所以需要对目录进行分类。
commons 存放配置文件
controler 存放 类 文件
static 存放静态文件
templates 存放html文件
app.py 是主文件
下面看看各文件内容:
settings:
settings = { 'template_path': 'templates', 'static': 'static' }
home.py
import tornado.web user_info = [] class MainHandler(tornado.web.RequestHandler): def get(self): # self.write("Hello, world") self.render('index.html', user_info_list = user_info) def post(self, *args, **kwargs): user = self.get_argument('user') pwd = self.get_argument('pwd') user_info.append({'user': user, 'pwd': pwd}) self.redirect('/index')
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>你好</h1> <form action="/index" method="post"> <input type="text" name="user"> <input type="text" name="pwd"> <input type="submit" value="提交"> </form> <ul> {% for item in user_info_list %} <li>{{item.get('user')}}-{{item['pwd']}}</li> {% end %} </ul> </body> </html>
注意:tornado的模版语言更像是纯python的,和django不一样。
app.py
from tornado import ioloop import tornado.web from controler.home import MainHandler from commons.settings import settings application = tornado.web.Application([ (r"/index", MainHandler), # url--对应类,django对应的是函数 ], **settings # 加载配置 ) if __name__ == "__main__": application.listen(8888) ioloop.IOLoop.instance().start()
查看效果:
提交后:
二、路由系统
路由系统其实就是 url 和 类 的对应关系,这里不同于其他框架,其他很多框架均是 url 对应 函数,Tornado中每个url对应的是一个类。
import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") class StoryHandler(tornado.web.RequestHandler): def get(self, story_id): self.write("You requested the story " + story_id) class BuyHandler(tornado.web.RequestHandler): def get(self): self.write("buy.wupeiqi.com/index") application = tornado.web.Application([ (r"/index", MainHandler), (r"/story/([0-9]+)", StoryHandler), ]) application.add_handlers('buy.wupeiqi.com$', [ (r'/index',BuyHandler), ]) if __name__ == "__main__": application.listen(80) tornado.ioloop.IOLoop.instance().start()