基礎(chǔ)掌握點(diǎn)

路由解析

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)求的核心類

  1. 接入點(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ù)
  2. 輸入捕獲

    • 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字典
  3. 輸出響應(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)求中之前寫入的HeaderBody內(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()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瞧剖,隨后出現(xiàn)的幾起案子拭嫁,更是在濱河造成了極大的恐慌,老刑警劉巖抓于,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件做粤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捉撮,警方通過(guò)查閱死者的電腦和手機(jī)怕品,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)巾遭,“玉大人肉康,你說(shuō)我怎么就攤上這事∽粕幔” “怎么了吼和?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)骑素。 經(jīng)常有香客問我炫乓,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任末捣,我火速辦了婚禮侠姑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘箩做。我一直安慰自己莽红,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布卒茬。 她就那樣靜靜地躺著船老,像睡著了一般。 火紅的嫁衣襯著肌膚如雪圃酵。 梳的紋絲不亂的頭發(fā)上柳畔,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音郭赐,去河邊找鬼薪韩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛捌锭,可吹牛的內(nèi)容都是我干的俘陷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼观谦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拉盾!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起豁状,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捉偏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后泻红,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夭禽,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年谊路,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了讹躯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缠劝,死狀恐怖潮梯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惨恭,我是刑警寧澤酷麦,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站喉恋,受9級(jí)特大地震影響沃饶,放射性物質(zhì)發(fā)生泄漏母廷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一糊肤、第九天 我趴在偏房一處隱蔽的房頂上張望琴昆。 院中可真熱鬧,春花似錦馆揉、人聲如沸业舍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)舷暮。三九已至,卻和暖如春噩茄,著一層夾襖步出監(jiān)牢的瞬間下面,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工绩聘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沥割,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓凿菩,卻偏偏與公主長(zhǎng)得像机杜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子衅谷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 譯者說(shuō) Tornado 4.3于2015年11月6日發(fā)布椒拗,該版本正式支持Python3.5的async/await...
    TaoBeier閱讀 3,041評(píng)論 0 10
  • 引言 以Django為代表的python web應(yīng)用部署時(shí)采用wsgi協(xié)議與服務(wù)器對(duì)接(被服務(wù)器托管),而這類服務(wù)...
    大熊_7d48閱讀 2,037評(píng)論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理获黔,服務(wù)發(fā)現(xiàn)陡叠,斷路器,智...
    卡卡羅2017閱讀 134,656評(píng)論 18 139
  • tornado框架是一款相較于其他web framework處理服務(wù)器性能問題更加強(qiáng)健的輕量級(jí)的強(qiáng)大的Pytho...
    惡人未滿閱讀 7,127評(píng)論 3 10
  • 網(wǎng)站鏈接 大家支持一下喔:-O 要評(píng)論的讀者們也不要手軟肢执,盡情吐槽,說(shuō)說(shuō)你們的建議译红,我會(huì)積極聽取的预茄。 所謂,虛心求...
    行走的大電燈泡閱讀 186評(píng)論 0 0