標籤:
【課程】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類源碼剖析