Tornado 学习笔记 Tornado基础 2
2015-02-01 11:32
417 查看
内容原子官方文档:
Tornado基础
模板和UI
模板可以使用多种模板语言,通过 RequestHandler.render整合到系统中,简单渲染字符串通过RequestHandler.write
配置[b]模板[/b]
默认会在py文件相同目录查找模板,在其他位置可以使用template_path Application setting 或者覆盖 RequestHandler.get_template_path 。如果不是文件系统的位置,可以通过 tornado.template.BaseLoader子类并传入一个template_loader 实例。 模板缓存默认开启,如果想关闭可以设置compiled_template_cache=False 或者debug=True 。
模板语法
调用
表达式: 支持RequestHandler.render and render_string,需要用于RequestHandler内,如果使用tornado.template,有部分无法支持。
escape: alias for tornado.escape.xhtml_escape
xhtml_escape: alias for tornado.escape.xhtml_escape
url_escape: alias for tornado.escape.url_escape
json_encode: alias for tornado.escape.json_encode
squeeze: alias for tornado.escape.squeeze
linkify: alias for tornado.escape.linkify
datetime: the Python datetime module
handler: the current RequestHandler object
request: alias for handler.request
current_user: alias for handler.current_user
locale: alias for handler.locale
_: alias for handler.locale.translate
static_url: alias for handler.static_url
xsrf_form_html: alias for handler.xsrf_form_html
reverse_url: alias for Application.reverse_url
All entries from the ui_methods and ui_modules Application settings
Any keyword arguments passed to render or render_string
界面模块
界面模块是一种可重用组件,例如博客的主页面和内容页都使用显示一条博客功能。
定义Entry模块,文件名uimodules.py
模板的首页面中调用Entry 模块
授权和安全
配置加密cookie
用户授权
当前已授权的用户会保持在请求处理器的self.current_user中,并且在模板变量current_user中。
下面是使用加密cookie保存数据方式的用户登录授权实例:
可以通过 tornado.web.authenticated装饰器使用授权状态。
启用XSRF
使用多核CPU
嵌入到WSGI容器运行
嵌入到WSGI容器后,只可以运行tornado的一个子集功能,不支持异步操作,包括协程、@asynchronous装饰器、AsyncHTTPClient, the auth module, and WebSockets.
本文出自 “LifeStage” 博客,请务必保留此出处http://soaop.blog.51cto.com/6164600/1610423
Tornado基础
模板和UI
模板可以使用多种模板语言,通过 RequestHandler.render整合到系统中,简单渲染字符串通过RequestHandler.write
配置[b]模板[/b]
默认会在py文件相同目录查找模板,在其他位置可以使用template_path Application setting 或者覆盖 RequestHandler.get_template_path 。如果不是文件系统的位置,可以通过 tornado.template.BaseLoader子类并传入一个template_loader 实例。 模板缓存默认开启,如果想关闭可以设置compiled_template_cache=False 或者debug=True 。
模板语法
<html> <head> <title>{{ title }}</title> </head> <body> <ul> {% for item in items %} <li>{{ escape(item) }}</li> {% end %} </ul> </body> </html>
调用
class MainHandler(tornado.web.RequestHandler): def get(self): items = ["Item 1", "Item 2", "Item 3"] self.render("template.html", title="My title", items=items)
表达式: 支持RequestHandler.render and render_string,需要用于RequestHandler内,如果使用tornado.template,有部分无法支持。
escape: alias for tornado.escape.xhtml_escape
xhtml_escape: alias for tornado.escape.xhtml_escape
url_escape: alias for tornado.escape.url_escape
json_encode: alias for tornado.escape.json_encode
squeeze: alias for tornado.escape.squeeze
linkify: alias for tornado.escape.linkify
datetime: the Python datetime module
handler: the current RequestHandler object
request: alias for handler.request
current_user: alias for handler.current_user
locale: alias for handler.locale
_: alias for handler.locale.translate
static_url: alias for handler.static_url
xsrf_form_html: alias for handler.xsrf_form_html
reverse_url: alias for Application.reverse_url
All entries from the ui_methods and ui_modules Application settings
Any keyword arguments passed to render or render_string
界面模块
界面模块是一种可重用组件,例如博客的主页面和内容页都使用显示一条博客功能。
定义Entry模块,文件名uimodules.py
class Entry(tornado.web.UIModule): def render(self, entry, show_comments=False): return self.render_string( "module-entry.html", entry=entry, show_comments=show_comments主程序中设置使用ui_modules。
from . import uimodulesclass HomeHandler(tornado.web.RequestHandler): def get(self): entries = self.db.query("SELECT * FROM entries ORDER BY date DESC") self.render("home.html", entries=entries)class EntryHandler(tornado.web.RequestHandler): def get(self, entry_id): entry = self.db.get("SELECT * FROM entries WHERE id = %s", entry_id) if not entry: raise tornado.web.HTTPError(404) self.render("entry.html", entry=entry)settings = { "ui_modules": uimodules,}application = tornado.web.Application([ (r"/", HomeHandler), (r"/entry/([0-9]+)", EntryHandler),], **settings)
模板的首页面中调用Entry 模块
{% for entry in entries %} {% module Entry(entry) %} {% end %}模板的内容页调用Entry 模块
{% module Entry(entry, show_comments=True) %}模型定义可以使用embedded_css,embedded_javascript, javascript_files, or css_files 方法:
class Entry(tornado.web.UIModule): def embedded_css(self): return ".entry { margin-bottom: 1em; }" def render(self, entry, show_comments=False): return self.render_string( "module-entry.html", show_comments=show_comments)或者直接定义在模板中
{{ set_resources(embedded_css=".entry { margin-bottom: 1em; }") }} <!-- more template html... -->调用带有嵌入内容的模板
{% module Template("module-entry.html", show_comments=True) %}
授权和安全
配置加密cookie
application = tornado.web.Application([ (r"/", MainHandler), ], cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__")可以使用 set_secure_cookie and get_secure_cookie方法使用加密cookie。
class MainHandler(tornado.web.RequestHandler): def get(self): if not self.get_secure_cookie("mycookie"): self.set_secure_cookie("mycookie", "myvalue") self.write("Your cookie was not set yet!") else: self.write("Your cookie was set!")
用户授权
当前已授权的用户会保持在请求处理器的self.current_user中,并且在模板变量current_user中。
下面是使用加密cookie保存数据方式的用户登录授权实例:
class BaseHandler(tornado.web.RequestHandler): def get_current_user(self): return self.get_secure_cookie("user")class MainHandler(BaseHandler): def get(self): if not self.current_user: self.redirect("/login") return name = tornado.escape.xhtml_escape(self.current_user) self.write("Hello, " + name)class LoginHandler(BaseHandler): def get(self): self.write('<html><body><form action="/login" method="post">' 'Name: <input type="text" name="name">' '<input type="submit" value="Sign in">' '</form></body></html>') def post(self): self.set_secure_cookie("user", self.get_argument("name")) self.redirect("/")application = tornado.web.Application([ (r"/", MainHandler), (r"/login", LoginHandler),], cookie_secret="__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__")
可以通过 tornado.web.authenticated装饰器使用授权状态。
class MainHandler(BaseHandler): @tornado.web.authenticated def get(self): name = tornado.escape.xhtml_escape(self.current_user) self.write("Hello, " + name)settings = { "cookie_secret": "__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__", "login_url": "/login",}application = tornado.web.Application([ (r"/", MainHandler), (r"/login", LoginHandler),], **settings)XSRF
启用XSRF
settings = { "cookie_secret": "__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__", "login_url": "/login", "xsrf_cookies": True,}application = tornado.web.Application([ (r"/", MainHandler), (r"/login", LoginHandler),], **settings)使用XSRF在普通表单
<form action="/new_message" method="post"> {% module xsrf_form_html() %} <input type="text" name="message"/> <input type="submit" value="Post"/> </form>使用XSRF在AJAX中
function getCookie(name) { var r = document.cookie.match("\\b" + name + "=([^;]*)\\b"); return r ? r[1] : undefined; } jQuery.postJSON = function(url, args, callback) { args._xsrf = getCookie("_xsrf"); $.ajax({url: url, data: $.param(args), dataType: "text", type: "POST", success: function(response) { callback(eval("(" + response + ")")); }}); };启动服务
def main(): app = make_app() app.listen(8888) IOLoop.current().start()if __name__ == '__main__': main()
使用多核CPU
def main(): app = make_app() server = tornado.httpserver.HTTPServer(app) server.bind(8888) server.start(0) # forks one process per cpu IOLoop.current().start()静态目录设置
settings = { "": os.path.join(os.path.dirname(__file__), "static"), "cookie_secret": "__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__", "login_url": "/login", "xsrf_cookies": True,} application = tornado.web.Application([ (r"/", MainHandler), (r"/login", LoginHandler), (r"/(apple-touch-icon\.png)", tornado.web.StaticFileHandler, dict(path=settings['static_path'])),], **settings)
嵌入到WSGI容器运行
嵌入到WSGI容器后,只可以运行tornado的一个子集功能,不支持异步操作,包括协程、@asynchronous装饰器、AsyncHTTPClient, the auth module, and WebSockets.
import tornado.webimport tornado.wsgiclass MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world")tornado_app = tornado.web.Application([ (r"/", MainHandler),])application = tornado.wsgi.WSGIAdapter(tornado_app)
本文出自 “LifeStage” 博客,请务必保留此出处http://soaop.blog.51cto.com/6164600/1610423
相关文章推荐
- Tornado 学习笔记 Tornado基础 1
- UML基础学习笔记一
- JAVA学习笔记(基础知识)
- MOM2005基础架构设计学习笔记3
- Java2核心技术第七版的学习笔记(三) Fundamental Programming Structures in Java(Java语言的基础)(二)
- 《JAVA2核心技术 卷一 基础知识(原书第七版)》《Core java2,Volume I-Fondamentsls Seven Edition》 学习笔记(三)对象的克隆
- ASP.NET 学习笔记之一 ASP.NET基础
- Pro visual c++/cli and .net 2.0 platform2 学习笔记(7第二章 C++/CLI基础=2)
- MOM2005基础架构设计学习笔记1
- wml语言学习笔记--基础教程(转)
- bash学习笔记1-bash基础
- Linux 学习笔记( LINUX运行的硬件基础1)
- 《面向对象基础:C++实现》学习笔记之四
- 《面向对象基础:C++实现》学习笔记之一
- MOM2005基础架构设计学习笔记2
- Linux基础知识学习笔记(一)--文件系统的权限管理
- C#学习笔记(二十一):使用文件基础
- C++学习笔记——基础知识
- 《JAVA2核心技术 卷一 基础知识(原书第七版)》《Core java2,Volume I-Fondamentsls Seven Edition》 学习笔记(一)
- Pro visua 4000 l c++/cli and .net 2.0 platform2 学习笔记(6 第二章 C++/CLI基础=1 )