tornado.Application

一直想看tornado源碼,今天看了Application類,Application的主要做用是接收來自httpserver的httprequest,而後根據httprequest中的host和path來尋找匹配的RequestHandler。python

首先Application的構造函數有不少參數正則表達式

handlers --- 一大堆匹配規則(正則表達式)和requesthandler的元組。多線程

default_host --- 默認主機,若是找不到對應host的handler,則將頁面跳轉到http://{{default_host}}/頁面(只是個猜想,我沒有測試過)。app

transforms --- 這個不知道是幹嗎的。函數

ui_modules --- 指定當前application對象的ui模塊,能夠傳模塊,list和UIModuletornado

ui_method --- 制定當前application的ui_method對象,一樣能夠傳module, list和func。(ui_method就是那些在template中定義的方法)測試

static_path --- 靜態文件地址ui

static_url_prefix --- 靜態文件請求的url前綴,默認是/static/url

static_handler_class --- 靜態文件對應的處理類型,默認是tornado自帶的StaticFileHandler,能夠本身寫。spa

static_handler_args --- 靜態文件處理類型的參數

 

listen(self, port, address="", **kwargs) 方法建立一個HTTPServer實例,而後調用這個實例的listen()方法。註釋中特別說明,若是是多線程的用法不能用該函數,須要顯示調用HTTPServer或TCPServer本身的方法。

add_handlers(self, host_pattern, host_handlers)方法的做用是往self.handler中添加handler。這裏須要注意若是handler匹配的url中有通配符,那麼這個handler的優先級就會降低(排到了後面),若是添加相同的正則表達式會tornado會報異常。

add_transform(self, transform_class)這個函數是往self.transforms增長transform_class,可是transforms到底用來幹什麼我還不知道。

_load_ui_methods(self, methods)往self.ui_methods中添加方法

_load_ui_modules(self, modules)與_load_ui_method的功能是同樣的。

reverse_url(self, name, *args)這個方法不知道是用來幹嗎的。

log_request(self, handler)這個方法是吧請求寫進日誌,http狀態小於400的都是屬於正常狀態,大於等於400小於500的都屬於警告狀態,除了上面的狀態以外的都是錯誤狀態。

_get_host_handlers(self, request)這個方法會根據request的host尋找屬於這個的handlers,

__call__(self, request)方法使application實例對象變成可調用,它會調用_get_host_handlers(),將獲取到的handlers再根據path來肯定具體要使用的handler。它作了一些處理,好比若是沒有找到對應host的handlers,那麼直接跳轉到默認host下面。若是沒有找到匹配的Handler那麼跳轉到默認頁面或者拋出404異常。另外它還會根據配置決定是否cache編譯好的template文件,是否cache靜態文件。

另外我還從代碼中發現,若是是debug模式,默認會開啓autoreload和serve_traceback功能,關閉compiled_template_cache和static_hash_cache功能,你能夠經過在Application的__init__()函數中開啓他們。

 

python 中 setdefault()方法仍是頗有用的,若是字典中沒有這個值,那麼就添加並賦值,若是有就忽略本次操做。

>>> a = {"name": "eleven"}
>>> print a
{'name': 'eleven'}
>>> a.setdefault("name", "yumi")
'eleven'
>>> a.setdefault("age", 23)
23
>>> print a
{'age': 23, 'name': 'eleven'}

dict中get()方法在不傳第二個參數的狀況下若是沒有指定的鍵會返回None,不會報錯,我以前還一直指定第二個參數爲None。

>>> b = {}
>>> print repr(b.get("name"))
None

python中or操做就至關因而C中的三目運算符?:

>>> 1 or []
1
>>> 0 or []
[]
>>> 1 if 1 else []
1
>>> 0 if 0 else []
[]

就這樣吧,晚上再寫點Baade項目的東西,原本昨天Baade是要上線的。

下個月跟小夥伴參加淘寶的黑客馬拉松,要給力呀。

相關文章
相關標籤/搜索