导图社区 Introduction to Tornado
Introduction to Tornado思维导图,包括:引言、表单和模板、模板扩展、数据库、异步Web服务编写、安全应用、外部服务认证。
编辑于2022-06-28 21:23:43Introduction to Tornado
引言
简介
安装
社区和支持
简单的Web服务
Hello Tornado
options
define()
web.RequestHandler
get()
get_argument()
write()
web.Application
handler
正则路由
字符串服务
textwrap()
RequestHandler
post()
更多关于RequestHandler
HTTP方法
retrieve_from_db()
save_to_db()
HTTP状态码
RequestHandler
write_error()
表单和模板
简单示例:Poem Maker Pro
RequestHandler
render()
Application
template_path
渲染模板
填充
{{ }}
模板语法
tornado.template.Template
generate()
填充表达式
控制流语句
{% %}
任意语句
在模板中使用函数
escape(s)
url_escape(s)
按url转义
json_encode(val)
按JSON编码
squeeze(s)
去除多余空格
复杂示例:The Alpha Munger
Application
static_path
debug=True
每次代码改变,会重启服务器
如何工作
静态文件
设置static_path
用static_url生成静态URL
好处
根据文件内容创建hash码,置于文件名尾,保证浏览器得到最新版本
改变URL结构而不需改变模板编码
模板扩展
块和替换
{% extend "main.html" %}
块基础
{% block header %}{% end %}
模板实战:Burt's Books
继承Application类
自动转义
两个大括号中间的内容
取消
在Application类中构建autoescape=None
{% autoescape None %}
{% raw %}
linkify()和xsrf_form_html()
UI模块
模块的基本使用
web.UIModule
render()
Application
ui_modules
{% module %}
模块深入
UIModule
render
render_string()
tornado.locale
locale.format_date()
relative=False
绝对时间
full_format=True
显示全时间
shorter=True
只显示年月日
嵌入JavaScript和CSS
UIModule
embedded_javascript()
在</body>前
embedded_css()
在</head>前
html_body()
插入完整的HTML标记
在</body>前
javascript_files()
css_files()
注意
顺序
html_body(), javascript_files()和embedded_javascript()按指定顺序反序
数据库
使用PyMongo进行基本MongoDB操作
安装
PyMongo
http://api.mongodb.org/python/current/
创建一个连接
连接
conn=pymongo.Connection("localhost", 27017)
conn = pymongo.Connection("mongodb://usr:pwd@staff.mongohq.com:10066/your_db")
数据库
db = conn.example
db = conn["example"]
集合
db.collection_names()
创建
widgets = db.widgets
widgets = db["widgets"]
文档
widgets.insert({"foo": "bar"})
处理文档
find_one()
save()
注意:修改后没有即时写入数据库
find()
remove()
MongoDB文档和JSON
json模块
dumps()
无法处理_id
删除该键
Pymongo的json_util库
一个简单的持久性Web服务
只读字典
写字典
Burt's Books
从数据库中读取书籍
编辑和添加书籍
渲染编辑表单
从数据库中取出书籍信息
保存到数据库中
MongoDB:下一步
异步Web服务
异步Web请求
本章例
取得每秒某个查询条件下的推文数
从同步开始
tornado.httpclient
HTTPClient()
fetch()
阻塞的困扰
benchmark
Siege utility
基本异步调用
装饰器
@tornado.web.asynchronous
在get前使用
tornado.httpclient
AsyncHTTPClient()
fetch()
callback=self.on_response
回调函数
on_response(self, response)
self.finish()
异步装饰器和finish方法
@tornado.web.asynchronous
保证一直连接
需要显式调用finish方法关闭连接
异步产生器
问题
分割请求处理为不同的方法
tornado.gen
@tornado.gen.engine
在get前使用
yield tornado.gen.Task(client.fetch)
不用再使用回调函数
异步操作总结
使用Tornado推送
推送的好处
减少了web服务器的负载
浏览器兼容性
示例:实时库存报告
uuid.uuid4
jquery
推送的缺点
服务器没有浏览器请求超时间隔控制权
许多浏览器对同时一个主机打开的链接数有限制
使用Tornado处理WebSockets
WebSockets
注意
html5(目前仍为草案)
只有最新的浏览器支持
好处
C和S端长连接的双向通讯
ws://URL
Tornado的WebSocket模块
tornado.websocket.WebSocketHandler
open()
on_message()
on_close()
write_message()
示例:基于WebSockets的实时库存
js
WebSocket类
编写安全应用
Cookie漏洞
Cookie伪造
JS/Flash
浏览器插件
安全Cookies
加密签名验证
使用安全Cookies
set_secure_cookie()
get_secure_cookie()
settings
cookie_secret
是签名不是加密
缺点
仍然可能被截获
提权攻击
httponly
secure
HTTP-only和SSL cookie
依附于python的Cookie模块
属性(set_cookie/set_secure_cookie)
secure
通过SSL传输
httponly
Python2.6
JS不可达,避免XSS
请求漏洞
剖析XSRF
防范请求伪造
重要操作使用POST
防止伪造POST请求
每个请求包括一个匹配cookie的参数作为令牌
使用Tornado的XSRF保护
settings
xsrf_cookies
{% raw xsrf_form_html() %}
XSRF令牌和AJAX请求
也需要_xsrf参数
可以从客户端获得
postJSON
其他方法
Mozilla的Secure Coding Guidelines
用户验证
示例:欢迎回来
authenticated装饰器
@tornado.web.authenticated
current_user属性
login_url设置
current_user属性
重写get_current_user()方法
login_url设置
外部服务认证
Tornado的auth模块
auth模块
OpenID
OAuth
OAuth 2.0
FriendFeed
Google OpenID
Facebook REST API
Facebook Graph API
授权工作流程
authorize_redirect
重定向未授权用户到外部服务验证界面
get_authenticated_user
异步请求
示例:登录Twitter
tornado.auth.TwitterMixin
get_authenticated_user
authorize_redirect()
settings
twitter_consumer_key
twitter_consumer_secret
示例:Facebook认证和Graph API
两种标准
REST API
Graph API
tornado.auth.FacebookGraphMixin
facebook_request
settings
facebook_api_key
facebook_secret
部署Tornado
运行多个Tornado实例的原因
同步函数造成阻塞时,单一进程无法响应新的请求
使用Nginx作为反向代理
代理服务器
中转客户端请求到合适的服务端
反向代理服务器
客户端访问网络时连接到反向代理服务器
反向代理服务器转发请求到任一Tornado服务端主机
Nginx基本配置
默认轮询,可以自定义(如根据IP)
Nginx SSL解密
使用Supervisor管理Tornado进程
tornado.conf
group
program
supervisorctl
restart tornadoes:*
update
status