python tornado中文文档.docx
- 文档编号:28635951
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:30
- 大小:61.17KB
python tornado中文文档.docx
《python tornado中文文档.docx》由会员分享,可在线阅读,更多相关《python tornado中文文档.docx(30页珍藏版)》请在冰豆网上搜索。
pythontornado中文文档
概览
∙Overview
∙下载和安装
∙模块索引
o主要模块
o底层模块
∙Tornado攻略
o请求处理程序和请求参数
o重写RequestHandler的方法函数
o重定向(redirect)
o模板
oCookie和安全Cookie
o用户认证
o跨站伪造请求的防范
o静态文件和主动式文件缓存
o本地化
oUI模块
o非阻塞式异步请求
o异步HTTP客户端
o第三方认证
o调试模式和自动重载
∙性能
∙生产环境下的部署
∙WSGI和GoogleAppEngine
∙注意事项和社区支持
Overview
FriendFeed使用了一款使用Python编写的,相对简单的非阻塞式Web服务器。
其应用程序使用的Web框架看起来有些像web.py或者Google的webapp,不过为了能有效利用非阻塞式服务器环境,这个Web框架还包含了一些相关的有用工具和优化。
Tornado就是我们在FriendFeed的Web服务器及其常用工具的开源版本。
Tornado和现在的主流Web服务器框架(包括大多数Python的框架)有着明显的区别:
它是非阻塞式服务器,而且速度相当快。
得利于其非阻塞的方式和对epoll的运用,Tornado每秒可以处理数以千计的连接,因此Tornado是实时Web服务的一个理想框架。
我们开发这个Web服务器的主要目的就是为了处理FriendFeed的实时功能——在FriendFeed的应用里每一个活动用户都会保持着一个服务器连接。
(关于如何扩容服务器,以处理数以千计的客户端的连接的问题,请参阅TheC10Kproblem)
以下是经典的“Hello,world”示例:
importtornado.ioloop
importtornado.web
classMainHandler(tornado.web.RequestHandler):
defget(self):
self.write("Hello,world")
application=tornado.web.Application([
(r"/",MainHandler),
])
if__name__=="__main__":
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
查看下面的Tornado攻略以了解更多关于tornado.web包的细节。
我们清理了Tornado的基础代码,减少了各模块之间的相互依存关系,所以理论上讲,你可以在自己的项目中独立地使用任何模块,而不需要使用整个包。
下载和安装
自动安装:
Tornado已经列入PyPI,因此可以通过pip或者easy_install来安装。
如果你没有安装libcurl的话,你需要将其单独安装到系统中。
请参见下面的安装依赖一节。
注意一点,使用pip或easy_install安装的Tornado并没有包含源代码中的demo程序。
手动安装:
下载tornado-1.2.1.tar.gz
tarxvzftornado-1.2.1.tar.gz
cdtornado-1.2.1
pythonsetup.pybuild
sudopythonsetup.pyinstall
Tornado的代码托管在GitHub上面。
对于Python2.6以上的版本,因为标准库中已经包括了对epoll的支持,所以你可以不用setup.py编译安装,只要简单地将tornado的目录添加到PYTHONPATH就可以使用了。
安装需求
Tornado在Python2.5,2.6,2.7中都经过了测试。
要使用Tornado的所有功能,你需要安装PycURL(7.18.2或更高版本)以及simplejson(仅适用于Python2.5,2.6以后的版本标准库当中已经包含了对JSON的支持)。
为方便起见,下面将列出MacOSX和Ubuntu中的完整安装方式:
MacOSX10.6(Python2.6+)
sudoeasy_installsetuptoolspycurl
UbuntuLinux(Python2.6+)
sudoapt-getinstallpython-pycurl
UbuntuLinux(Python2.5)
sudoapt-getinstallpython-devpython-pycurlpython-simplejson
模块索引
最重要的一个模块是web,它就是包含了Tornado的大部分主要功能的Web框架。
其它的模块都是工具性质的,以便让web模块更加有用后面的Tornado攻略详细讲解了web模块的使用方法。
主要模块
∙web-FriendFeed使用的基础Web框架,包含了Tornado的大多数重要的功能
∙escape-XHTML,JSON,URL的编码/解码方法
∙database-对MySQLdb的简单封装,使其更容易使用
∙template-基于Python的web模板系统
∙httpclient-非阻塞式HTTP客户端,它被设计用来和web及httpserver协同工作
∙auth-第三方认证的实现(包括GoogleOpenID/OAuth、FacebookPlatform、YahooBBAuth、FriendFeedOpenID/OAuth、TwitterOAuth)
∙locale-针对本地化和翻译的支持
∙options-命令行和配置文件解析工具,针对服务器环境做了优化
底层模块
∙httpserver-服务于web模块的一个非常简单的HTTP服务器的实现
∙iostream-对非阻塞式的socket的简单封装,以方便常用读写操作
∙ioloop-核心的I/O循环
Tornado攻略
请求处理程序和请求参数
Tornado的Web程序会将URL或者URL范式映射到tornado.web.RequestHandler的子类上去。
在其子类中定义了get()或post()方法,用以处理不同的HTTP请求。
下面的代码将URL根目录/映射到MainHandler,还将一个URL范式/story/([0-9]+)映射到StoryHandler。
正则表达式匹配的分组会作为参数引入的相应方法中:
classMainHandler(tornado.web.RequestHandler):
defget(self):
self.write("Yourequestedthemainpage")
classStoryHandler(tornado.web.RequestHandler):
defget(self,story_id):
self.write("Yourequestedthestory"+story_id)
application=tornado.web.Application([
(r"/",MainHandler),
(r"/story/([0-9]+)",StoryHandler),
])
你可以使用get_argument()方法来获取查询字符串参数,以及解析POST的内容:
classMainHandler(tornado.web.RequestHandler):
defget(self):
self.write('
'
'
'')
defpost(self):
self.set_header("Content-Type","text/plain")
self.write("Youwrote"+self.get_argument("message"))
上传的文件可以通过self.request.files访问到,该对象将名称(HTML元素
每一个文件都以字典的形式存在,其格式为{"filename":
...,"content_type":
...,"body":
...}。
如果你想要返回一个错误信息给客户端,例如“403unauthorized”,只需要抛出一个tornado.web.HTTPError异常:
ifnotself.user_is_logged_in():
raisetornado.web.HTTPError(403)
请求处理程序可以通过self.request访问到代表当前请求的对象。
该HTTPRequest对象包含了一些有用的属性,包括:
∙arguments-所有的GET或POST的参数
∙files-所有通过multipart/form-dataPOST请求上传的文件
∙path-请求的路径(?
之前的所有内容)
∙headers-请求的开头信息
你可以通过查看源代码httpserver模组中HTTPRequest的定义,从而了解到它的所有属性。
重写RequestHandler的方法函数
除了get()/post()等以外,RequestHandler中的一些别的方法函数,这都是一些空函数,它们存在的目的是在必要时在子类中重新定义其内容。
对于一个请求的处理的代码调用次序如下:
1.程序为每一个请求创建一个RequestHandler对象
2.程序调用initialize()函数,这个函数的参数是Application配置中的关键字参数定义。
(initialize方法是Tornado1.1中新添加的,旧版本中你需要重写__init__以达到同样的目的)initialize方法一般只是把传入的参数存到成员变量中,而不会产生一些输出或者调用像send_error之类的方法。
3.程序调用prepare()。
无论使用了哪种HTTP方法,prepare都会被调用到,因此这个方法通常会被定义在一个基类中,然后在子类中重用。
prepare可以产生输出信息。
如果它调用了finish(或send_error`等函数),那么整个处理流程就此结束。
4.程序调用某个HTTP方法:
例如get()、post()、put()等。
如果URL的正则表达式模式中有分组匹配,那么相关匹配会作为参数传入方法。
下面是一个示范initialize()方法的例子:
classProfileHandler(RequestHandler):
definitialize(self,database):
self.database=database
defget(self,username):
...
app=Application([
(r'/user/(.*)',ProfileHandler,dict(database=database)),
])
其它设计用来被复写的方法有:
∙get_error_html(self,status_code,exception=None,**kwargs)-以字符串的形式返回HTML,以供错误页面使用。
∙get_current_user(self)-查看下面的用户认证一节
∙get_user_locale(self)-返回locale对象,以供当前用户使用。
∙get_login_url(self)-返回登录网址,以供@authenticated装饰器使用(默认位置在Application设置中)
∙get_template_path(self)-返回模板文件的路径(默认是Application中的设置)
重定向(redirect)
Tornado中的重定向有两种主要方法:
self.redirect,或者使用RedirectHandler。
你可以在使用RequestHandler(例如get)的方法中使用self.redirect,将用户重定向到别的地方。
另外还有一个可选参数permanent,你可以用它指定这次操作为永久性重定向。
该参数会激发一个301MovedPermanentlyHTTP状态,这在某些情况下是有用的,例如,你要将页面的原始链接重定向时,这种方式会更有利于搜索引擎优化(SEO)。
permanent的默认值是False,这是为了适用于常见的操作,例如用户端在成功发送POST请求以后的重定向。
self.redirect('/some-canonical-page',permanent=True)
RedirectHandler会在你初始化Application时自动生成。
例如本站的下载URL,由较短的URL重定向到较长的URL的方式是这样的:
application=tornado.wsgi.WSGIApplication([
(r"/([a-z]*)",ContentHandler),
(r"/static/tornado-0.2.tar.gz",tornado.web.RedirectHandler,
dict(url="
],**settings)
RedirectHandler的默认状态码是301MovedPermanently,不过如果你想使用302Found状态码,你需要将permanent设置为False。
application=tornado.wsgi.WSGIApplication([
(r"/foo",tornado.web.RedirectHandler,{"url":
"/bar","permanent":
False}),
],**settings)
注意,在self.redirect和RedirectHandler中,permanent的默认值是不同的。
这样做是有一定道理的,self.redirect通常会被用在自定义方法中,是由逻辑事件触发的(例如环境变更、用户认证、以及表单提交)。
而RedirectHandler是在每次匹配到请求URL时被触发。
模板
你可以在Tornado中使用任何一种Python支持的模板语言。
但是相较于其它模板而言,Tornado自带的模板系统速度更快,并且也更灵活。
具体可以查看template模块的源码。
Tornado模板其实就是HTML文件(也可以是任何文本格式的文件),其中包含了Python控制结构和表达式,这些控制结构和表达式需要放在规定的格式标记符(markup)中:
- {{escape(item)}}
{%foriteminitems%}
{%end%}
如果你把上面的代码命名为"template.html",保存在Python代码的同一目录中,你就可以这样来渲染它:
classMainHandler(tornado.web.RequestHandler):
defget(self):
items=["Item1","Item2","Item3"]
self.render("template.html",title="Mytitle",items=items)
Tornado的模板支持“控制语句”和“表达语句”,控制语句是使用{%和%}包起来的例如{%iflen(items)>2%}。
表达语句是使用{{和}}包起来的,例如{{items[0]}}。
控制语句和对应的Python语句的格式基本完全相同。
我们支持if、for、while和try,这些语句逻辑结束的位置需要用{%end%}做标记。
我们还通过extends和block语句实现了模板继承。
这些在template模块的代码文档中有着详细的描述。
表达语句可以是包括函数调用在内的任何Python表述。
模板中的相关代码,会在一个单独的名字空间中被执行,这个名字空间包括了以下的一些对象和方法。
(注意,下面列表中的对象或方法在使用RequestHandler.render或者render_string时才存在的,如果你在RequestHandler外面直接使用template模块,则它们中的大部分是不存在的)。
∙escape:
tornado.escape.xhtml_escape的別名
∙xhtml_escape:
tornado.escape.xhtml_escape的別名
∙url_escape:
tornado.escape.url_escape的別名
∙json_encode:
tornado.escape.json_encode的別名
∙squeeze:
tornado.escape.squeeze的別名
∙linkify:
tornado.escape.linkify的別名
∙datetime:
Python的datetime模组
∙handler:
当前的RequestHandler对象
∙request:
handler.request的別名
∙current_user:
handler.current_user的別名
∙locale:
handler.locale的別名
∙_:
handler.locale.translate的別名
∙static_url:
forhandler.static_url的別名
∙xsrf_form_html:
handler.xsrf_form_html的別名
∙reverse_url:
Application.reverse_url的別名
∙Application设置中ui_methods和ui_modules下面的所有项目
∙任何传递给render或者render_string的关键字参数
当你制作一个实际应用时,你会需要用到Tornado模板的所有功能,尤其是模板继承功能。
所有这些功能都可以在template模块的代码文档中了解到。
(其中一些功能是在web模块中实现的,例如UIModules)
从实现方式来讲,Tornado的模板会被直接转成Python代码。
模板中的语句会逐字复制到一个代表模板的函数中去。
我们不会对模板有任何限制,Tornado模板模块的设计宗旨就是要比其他模板系统更灵活而且限制更少。
所以,当你的模板语句里发生了随机的错误,在执行模板时你就会看到随机的Python错误信息。
所有的模板输出都已经通过tornado.escape.xhtml_escape自动转义(escape),这种默认行为,可以通过以下几种方式修改:
将autoescape=None传递给Application或者TemplateLoader、在模板文件中加入{%autoescapeNone%}、或者在简单表达语句{{...}}写成{%raw...%}。
另外你可以在上述位置将autoescape设为一个自定义函数,而不仅仅是None。
Cookie和安全Cookie
你可以使用set_cookie方法在用户的浏览中设置cookie:
classMainHandler(tornado.web.RequestHandler):
defget(self):
ifnotself.get_cookie("mycookie"):
self.set_cookie("mycookie","myvalue")
self.write("Yourcookiewasnotsetyet!
")
else:
self.write("Yourcookiewasset!
")
Cookie很容易被恶意的客户端伪造。
加入你想在cookie中保存当前登陆用户的id之类的信息,你需要对cookie作签名以防止伪造。
Tornado通过set_secure_cookie和get_secure_cookie方法直接支持了这种功能。
要使用这些方法,你需要在创建应用时提供一个密钥,名字为cookie_secret。
你可以把它作为一个关键词参数传入应用的设置中:
application=tornado.web.Application([
(r"/",MainHandler),
],cookie_secret="61oETzKXQAGaYdkL5gEmGeJJFuYh7EQnp2XdTP1o/Vo=")
签名过的cookie中包含了编码过的cookie值,另外还有一个时间戳和一个HMAC签名。
如果cookie已经过期或者签名不匹配,get_secure_cookie将返回None,这和没有设置cookie时的返回值是一样的。
上面例子的安全cookie版本如下:
classMainHandler(tornado.web.RequestHandler):
defget(self):
ifnotself.get_secure_cookie("mycookie"):
self.set_secure_cookie("mycookie","myvalue")
self.write("Yourcookiewasnotsetyet!
")
else:
self.write("Yourcookiewasset!
")
用户认证
当前已经认证的用户信息被保存在每一个请求处理器的self.current_user当中,同时在模板的current_user中也是。
默认情况下,current_user为None。
要在应用程序实现用户认证的功能,你需要复写请求
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- python tornado中文文档 tornado 中文 文档