【課程】web2.0程序設計
【做業要求】研究 application 對象源代碼。說明 Application 對象實例化時,給出「debug=True」參數,代碼動態自動編譯的原理。
【參考文檔】Application 類源代碼 tornado Application 官方文檔 debug模式和自動從新加載html
tornado.web提供了一個簡單的Web框架的異步功能。一個請求處理程序的集合就組成了一個web application.python
1.分析application類的源碼咱們知道,application類有如下幾種方法:git
·__init__(self, handlers=None, default_host="", transforms=None, **settings)
github
構造函數,接受一個URLSpec類對象或者一個(正則表達式,被請求的類)的元組做爲參數。當咱們接受請求時,程序會按順序遍歷列表,而且實例化第一個正則表達式可以匹配的請求類。
web
對應的元組也能夠包括其餘部分,參見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_loadercookie
靜態文件設置的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產生混亂。