文章目录
1. 前言
2. 从 hello, world 开始
3. 最简单的登录
4. 模板技术
5. Cookie 演练
6. Session 扩展
7. 后记
1. 前言
一身转战三千里,一剑曾当百万师。
今日赠君tornado,长风破浪会有时。
1
2
python 旗下,群英荟萃,豪杰并起。单是用于 web 开发的,就有 webpy、web2py、bottle、pyramid|、zope2、flask、tornado、django 等等,不一而足。最近几年较为流行的,大概也就是flask、tornado 和 django 了。
关于以上各个 web 开发框架的性能比较,上网一搜,铺天盖地——这不是本文讨论的重点,但有一点我想提醒大家:在以上众多模块中,只有 tornado 同时具备异步IO、webserver、web框架三大功能,同时又是最简洁的、学习门槛最低的。有 python 语言基础的程序员,只需要花十分钟就可以登堂入室了。
对于 tornado,我有很深的情感。如果把 web 开发框架比作程序员手中的冷兵器,我觉得 flask 好比是花枪, 轻灵飘逸,舞之令人眼花缭乱;django 像大戟,合矛戈为一体,可直刺,可横击,威力无比;tornado 秀外而惠中,更像是剑。剑在中国传统武术中有着很高的地位,为兵器之神,被认为有君子之风。
2. 从 hello, world 开始
言归正传。如果你的 python 环境还没有安装 tornado,请直接使用 pip 安装:
pip install tornado
1
下面的代码,虽然只有区区六行(不包括导入模块的两行),却是一个完整的 web 服务程序。运行下面的代码,就开启了一个 web 服务,从本机浏览器直接访问 http://127.0.0.1,不出意外的话,我们的第一个网页 hello, world 即可正常显示出来。
demo.py
# -*- coding: utf-8 -*-
import tornado.ioloop
import tornado.web
class HomeHandler(tornado.web.RequestHandler):
def get(self): # 响应以get方式发送的请求
self.write("hello, world") # 向请求者(浏览器)应答hello, world
app = tornado.web.Application([ (r"/", HomeHandler), ]) # URL映射
app.listen(80) # 绑定侦听端口
tornado.ioloop.IOLoop.instance().start() # 启动服务
1
2
3
4
5
6
7
8
9
10
11
12
如果多少了解一点 http 协议,知道 get / post 方法,相信你一定能够读懂。也许你的项目规划了很多的url,也许你的服务需要监听非80端口,没有关系,在这个代码上扩展就行。仅仅六行!!!请让我们向犀利的、简洁的、无所不能的 python 致敬!
划重点:tornado.web.RequestHandler.write() 不只可以接受字符串参数,还可以接受列表或字典参数——如果应答类型为json时,这个重载特性非常高效
3. 最简单的登录
假定我们有这样一个 web 服务需求:
首页:地址“/”,显示“点此登录”两个汉字,点击则跳转到登录页面
登录页:地址“/login”,以 get 方式访问,则显示账号、密码输入框和登录按钮;以 post 方式访问,则是提交表单提交,验证登录信息。登录成功,跳转至个人信息页面,否则,跳转至首页
个人信息页:地址“/me”,显示登录账号
以上面的代码为基础,我们首先要做的工作是 URL 和 对应的处理类之间的关联。这件工作实际上是非常轻松愉快的:
app = tornado.web.Application([
(r"/", HomeHandler),
(r"/login", LoginHandler),
(r"/me", MeHandler)
])
1
2
3
4
5
接下来,我们要实现 HomeHandler、LoginHandler 和 MeHandler 这三个类了。通常,我们习惯把这些和URL 对应的处理类,保存为一个独立的文件,比如文件名为 handlers.py,然后在服务器脚本 demo.py 中导入它们。
handlers.py
# -*- coding: utf-8 -*-
import tornado.web
class HomeHandler(tornado.web.RequestHandler):
"""响应主页请求"""
def get(self): # 以get方式请求
self.write("""<!DOCTYPE html><html><body><a href="login">点此登录</a></body></html>