tornado web.py Application類源碼剖析

來源:互聯網
上載者:User

標籤:

【課程】web2.0程式設計
【作業要求】研究 application 對象原始碼。說明 Application 對象執行個體化時,給出“debug=True”參數,代碼動態自動編譯的原理。
【參考文檔】Application 類原始碼   tornado Application 官方文檔   debug模式和自動重新載入

 

tornado.web提供了一個簡單的Web架構的非同步功能。一個請求處理常式的集合就組成了一個web application.

 

1.分析application類的源碼我們知道,application類有以下幾種方法:

 

·__init__(self, handlers=None, default_host="", transforms=None, **settings)

建構函式,接受一個URLSpec類對象或者一個(Regex,被請求的類)的元組作為參數。當我們接受請求時,程式會按順序遍曆列表,並且執行個體化第一個Regex能夠匹配的請求類。

對應的元組也可以包括其他部分,參見URLSpec建構函式的參數列表。

其中setting可以做一系列設定。

在tornado中的通用setting有:autoreload,debug,default_handler_class,compress_response,gzip,serve_traceback,log_function,ui_modules,ui_method

身分識別驗證和安全設定的setting:cookie_secret,login_url,xsrf_cookies,xsrf_cookie_version等等。

模板設定的setting:autoescape,compiled_template_cache,template_path,template_loader

靜態檔案設定的setting:static_hash_cache,static_path,static_url_prefix,static_handler_class, static_handler_args

 

·listen(self, port, address="", **kwargs)

 為這個應用在給定的連接埠啟動http伺服器。這是一個建立HTTPServer對象並且調用listen函數的簡便方法。

注意: HTTPServer.listen不支援的關鍵字參數通過HTTPServer的建構函式傳進來;在進階用途如多進程模式中,不調用這個方法,而是建立一個HTTPServer對象,並且直接調用 TCPServer.bind/TCPServer.start();調用完這個函數之後,還是需要調用IOLoop.instance().start()來開始服務。

 

·_get_host_handlers(self, request)

 擷取主機的handlers,若找不到,返回false;

 

以下函數就和建構函式中的setting的一些值相對應:

·_load_ui_methods(self, methods)

·_load_ui_modules(self, modules)

·start_request(self, connection) 

 

·__call__(self, request)
python一個文法特性,使得application可以直接當作函數被調用

 

·reverse_url(self, name, *args)

返回一個handler的URL路徑,這個handler必須已經被作為URLSpec被加入application裡面,

 

·log_request(self, handler)
一個完整的HTTP請求的記錄日誌,預設寫入root logger.若想改變logs儲存的位置,可重寫這個方法,或在application的setting字典裡傳進一個函數作為log_function

 

 

2.現在我們重點分析Application 對象執行個體化時,給出“debug=True”參數,代碼動態自動編譯的原理,主要也就是建構函式參數列表中的setting值。

 

如果你將debug=true作為參數傳進Application的建構函式,那麼這個應用將會在debug模式下運行。在這個模式中,有幾個特性是會設定好的,而這些特性也可以單獨設定,當兩種設定都存在時,單獨設定比這樣的預設設定優先權高。

特性如下:

autoreload=True:當有任何變化時,該應用程式會監視其源檔案的更改,並重新載入自身。這減少了開發過程中手動重新啟動伺服器。然而,某些故障(如在匯入時的語法錯誤)偵錯模式目前不能直接恢複。
compiled_template_cache=False:模板不會被緩衝。
static_hash_cache=False:靜態檔案的雜湊值(static_url函數會使用到的)將不會被緩衝
serve_traceback=True‘:當一個RequestHandler的異常沒有被捕獲,會產生一個錯誤頁,包括一個堆疊追蹤也會產生。

自動重新載入模式和多線程模式不相容。偵錯模式的自動載入特性可以作為tornado.autoreload的一個獨立的模組,二者可以結合:設定autoreload=True 來檢測應用在運行過程中的改變,並用 python -m tornado.autoreload myserver.py 的方法來開啟應用,用以捕獲非同步異常或其他錯誤。

重載會失去python解譯器的命令參數,因為他的再執行使用的是sys.executable 和sys.argv.,所以修改這些值會導致重載方式不正確。在一些平台上,進程不能在適當的位置更新,那麼代碼的改變被檢測到後,舊服務還在,新的服務已經開始了,就會使IDE產生混亂。

tornado web.py Application類源碼剖析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.