路由解析
handlers = [
('/', MainHandler),
('/entry', EntryHandler),
(r'/entry/([(^/)+])', EntryHandler1), # 路徑中的參數(shù)部分用小括號(hào)'()'標(biāo)識(shí)
(r'/entry/([(^/)*])', EntryHandler2) # 帶默認(rèn)值的參數(shù)路徑
]
# 第四個(gè)路由對(duì)應(yīng)的handler如下所示
class EntryHander2(tornado.web.RequestHandler):
def get(self, slug='default'):
pass
RequestHandler
配置和響應(yīng)URL請(qǐng)求的核心類
-
接入點(diǎn)函數(shù)
-
RequestHandler.intialize()
- 實(shí)現(xiàn)RequestHandler子類實(shí)例測(cè)初始化過(guò)程
-
RequestHandler.prepare()
萌庆、RequestHandler.on_finish()
-
prepare()
——用于調(diào)用Action函數(shù)之前的初始化處理臼膏,可以做資源初始化操作囤采。 -
on_finish()
——用于請(qǐng)求處理結(jié)束后的一些清理工作酒朵,可做清理對(duì)象占用的內(nèi)存或者關(guān)閉數(shù)據(jù)庫(kù)連接等工作。
-
- HTTP Action處理函數(shù)
-
-
輸入捕獲
-
RequestHandler.get_argument(name)
、RequestHander.get_arguments(name)
獲得單個(gè)值表制;獲取多個(gè)值景埃,返回多個(gè)值的列表豪嗽。
用來(lái)獲取的是(1)URL查詢字符串參數(shù)(2)Post提交參數(shù)的參數(shù)合集抑胎。 -
RequestHandler.get_cookie(name, default=None)
根據(jù)Cookie名稱獲取Cookie值竭翠。 -
RequestHandler.request
返回tornado.httputil.HTTPServerRequst
對(duì)象實(shí)例估灿,該實(shí)例常用的屬性如下表:屬性名 說(shuō)明 method
請(qǐng)求方法 uri
客戶端請(qǐng)求的uri的完整內(nèi)容 path
uri路徑名囚灼,即不包含查詢字符串 query
uri中的查詢字符串 version
客戶端發(fā)送請(qǐng)求時(shí)使用的HTTP版本 headers
以字典方式表達(dá)的HTTP Headers body
以字符串方式表達(dá)的HTTP消息體 remote_ip
客戶端的IP地址 protocol
請(qǐng)求協(xié)議螃宙,如HTTP雁社、HTTPS host
請(qǐng)求消息體中的主機(jī)名 arguments
客戶端提交的所有參數(shù) files
以字典形式表達(dá)的客戶端上傳的文件,每個(gè)文件名對(duì)應(yīng)一個(gè)HTTPFile cookies
客戶端提交的Cookie字典
-
-
輸出響應(yīng)函數(shù)
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') # 會(huì)覆蓋上一個(gè)LANGUAGE的值
RequestHandler.add_handler(name, value)
不會(huì)像上面產(chǎn)生覆蓋的情形RequestHandler.write(chunk)
將給定的塊作為HTTP Body
發(fā)送給客戶端久脯。如果給定的塊是個(gè)字典纳胧,則會(huì)將這個(gè)塊以JSON
的格式發(fā)送給客戶端,同時(shí)將HTTP Header
中的Content_Type
設(shè)置成application/json
-
RequestHandler.finish(chunk=None)
通知Tornado:Response的生成工作已經(jīng)完成帘撰,調(diào)用finish()
后跑慕,將向客戶端發(fā)送HTTP Response。本方法適用于對(duì)RequestHandler的異步請(qǐng)求處理摧找。注意:在同步或協(xié)程訪問處理的函數(shù)中核行,無(wú)須調(diào)用
finish()
函數(shù) RequestHandler.clear()
清空所有在本次請(qǐng)求中之前寫入的Header
和Body
內(nèi)容。RequestHandler.set_cookie(name, value)
RequestHandler.clear_all_cookies(path='/', domain=None)
清空本次請(qǐng)求中的所有Cookie
協(xié)程化
協(xié)程結(jié)合了同步處理和異步處理的優(yōu)點(diǎn)蹬耘,使代碼清晰易懂芝雪,又能適應(yīng)海量客戶端的高并發(fā)請(qǐng)求。
import tornado.web
import tornado.httpclient
class MainHandler(tornado.web.RequestHandler):
@tornado.gen.coroutine # 裝飾處理函數(shù)
def get(self):
http = tornado.httpclient.AsynHTTPClient()
# 使用yield關(guān)鍵字獲取一步對(duì)象的處理結(jié)果
response = yield http.fetch('http://www.baidu.com')
self.write(response.body)
安全Cookie機(jī)制
Cookie是很多網(wǎng)站為了辨別用戶身份而儲(chǔ)存在用戶本地終端的數(shù)據(jù)综苔,比如保存Session信息惩系。
如何保證其不備篡改是服務(wù)器端程序必須解決的問題,Tornado提供了為Cookie信息加密的機(jī)制如筛,是的客戶端無(wú)法隨意解析和修改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") # 參數(shù)值是字符串,用于保存本網(wǎng)站Cookie加密時(shí)的密鑰妙黍。
def main():
application.listen(8888)
tornado.ioloop.IOLoop.current().start()
if __name__ == '__main__':
main()