路由解析
handlers = [
('/', MainHandler),
('/entry', EntryHandler),
(r'/entry/([(^/)+])', EntryHandler1), # 路径中的参数部分用小括号'()'标识
(r'/entry/([(^/)*])', EntryHandler2) # 带默认值的参数路径
]
# 第四个路由对应的handler如下所示
class EntryHander2(tornado.web.RequestHandler):
def get(self, slug='default'):
pass
RequestHandler
配置和响应URL请求的核心类
-
接入点函数
-
RequestHandler.intialize()
- 实现RequestHandler子类实例测初始化过程
-
RequestHandler.prepare()
、RequestHandler.on_finish()
-
prepare()
——用于调用Action函数之前的初始化处理,可以做资源初始化操作。 -
on_finish()
——用于请求处理结束后的一些清理工作,可做清理对象占用的内存或者关闭数据库连接等工作。
-
- HTTP Action处理函数
-
-
输入捕获
-
RequestHandler.get_argument(name)
、RequestHander.get_arguments(name)
获得单个值;获取多个值,返回多个值的列表。
用来获取的是(1)URL查询字符串参数(2)Post提交参数的参数合集。 -
RequestHandler.get_cookie(name, default=None)
根据Cookie名称获取Cookie值。 -
RequestHandler.request
返回tornado.httputil.HTTPServerRequst
对象实例,该实例常用的属性如下表:属性名 说明 method
请求方法 uri
客户端请求的uri的完整内容 path
uri路径名,即不包含查询字符串 query
uri中的查询字符串 version
客户端发送请求时使用的HTTP版本 headers
以字典方式表达的HTTP Headers body
以字符串方式表达的HTTP消息体 remote_ip
客户端的IP地址 protocol
请求协议,如HTTP、HTTPS host
请求消息体中的主机名 arguments
客户端提交的所有参数 files
以字典形式表达的客户端上传的文件,每个文件名对应一个HTTPFile cookies
客户端提交的Cookie字典
-
-
输出响应函数
-
RequestHandler.set_status(status_code, reason=None)
-
RequestHandler.set_header(name, value)
class DetailHandler(tornado.web.RequestHandler): def get(): self.set_header('NUMBER', 9) self.set_header('LANGUAGE', 'France') self.set_header('LANGUAGE', 'Chinese') # 会覆盖上一个LANGUAGE的值
-
RequestHandler.add_handler(name, value)
不会像上面产生覆盖的情形 -
RequestHandler.write(chunk)
将给定的块作为HTTP Body
发送给客户端。如果给定的块是个字典,则会将这个块以JSON
的格式发送给客户端,同时将HTTP Header
中的Content_Type
设置成application/json
-
RequestHandler.finish(chunk=None)
通知Tornado:Response的生成工作已经完成,调用finish()
后,将向客户端发送HTTP Response。本方法适用于对RequestHandler的异步请求处理。注意:在同步或协程访问处理的函数中,无须调用
finish()
函数 -
RequestHandler.clear()
清空所有在本次请求中之前写入的Header
和Body
内容。 -
RequestHandler.set_cookie(name, value)
-
RequestHandler.clear_all_cookies(path='/', domain=None)
清空本次请求中的所有Cookie
-
协程化
协程结合了同步处理和异步处理的优点,使代码清晰易懂,又能适应海量客户端的高并发请求。
import tornado.web
import tornado.httpclient
class MainHandler(tornado.web.RequestHandler):
@tornado.gen.coroutine # 装饰处理函数
def get(self):
http = tornado.httpclient.AsynHTTPClient()
# 使用yield关键字获取一步对象的处理结果
response = yield http.fetch('http://www.baidu.com')
self.write(response.body)
安全Cookie机制
Cookie是很多网站为了辨别用户身份而储存在用户本地终端的数据,比如保存Session信息。
如何保证其不备篡改是服务器端程序必须解决的问题,Tornado提供了为Cookie信息加密的机制,是的客户端无法随意解析和修改Cookie的键值。
import tornado.web
import tornado.ioloop
session_id = 1
class MainHandler(tornado.web.RequestHandler):
def get(self):
global session_id
# get_cookie() -> get_secure_cookie()
if not self.get_secure_cookie('session'):
# set_cookie() -> set_secure_cookie()
self.set_secure_cookie('session', str(session_id))
session_id = session_id + 1
else:
pass
application = tornado.web.Application([
(r'/', MainHandler),
], cookie_secret="SECRET_DONT_LEAK") # 参数值是字符串,用于保存本网站Cookie加密时的密钥。
def main():
application.listen(8888)
tornado.ioloop.IOLoop.current().start()
if __name__ == '__main__':
main()
网友评论