web.ctx
文章源於http://webpy.org/cookbook/ctx.zh-cn
問題
如何在代碼中得到客戶端信息?比如:來源頁面(referring page)或是客戶端瀏覽器類型
解法
使用web.ctx即可。首先講一點架構的東西:web.ctx基於threadeddict類,又被叫做ThreadDict。這個類創建了一個類似字典(dictionary-like)的對象,對象中的值都是與線程id相對應的。這樣做很妙,因爲很多用戶同時訪問系統時,這個字典對象能做到僅爲某一特定的HTTP請求提供數據(因爲沒有數據共享,所以對象是線程安全的)
web.ctx保存每個HTTP請求的特定信息,比如客戶端環境變量。假設,我們想知道正在訪問某頁面的用戶是從哪個網頁跳轉而來的:
例子
class example:
def GET(self):
referer = web.ctx.env.get('HTTP_REFERER', 'http://google.com')
raise web.seeother(referer)
上述代碼用web.ctx.env獲取HTTP_REFERER的值。如果HTTP_REFERER不存在,就會將google.com做爲默認值。接下來,用戶就會被重定向回到之前的來源頁面。
web.ctx另一個特性,是它可以被loadhook賦值。例如:當一個請求被處理時,會話(Session)就會被設置並保存在web.ctx中。由於web.ctx是線程安全的,所以我們可以象使用普通的python對象一樣,來操作會話(Session)。
'ctx'中的數據成員
Request
environ
又被寫做.env
– 包含標準WSGI環境變量的字典。home
– 應用的http根路徑(譯註:可以理解爲應用的起始網址,協議+站點域名+應用所在路徑)例:http://example.org/adminhomedomain
– 應用所在站點(可以理解爲協議+域名) http://example.orghomepath
– 當前應用所在的路徑,例如: /adminhost
– 主機名(域名)+用戶請求的端口(如果沒有的話,就是默認的80端口),例如: example.org,example.org:8080ip
– 用戶的IP地址,例如: xxx.xxx.xxx.xxxmethod
– 所用的HTTP方法,例如: GETpath
– 用戶請求路徑,它是基於當前應用的相對路徑。在子應用中,匹配外部應用的那部分網址將被去掉。例如:主應用在code.py
中,而子應用在admin.py
中。在code.py
中, 我們將/admin
關聯到admin.app
。 在admin.py
中, 將/stories
關聯到stories
類。在stories
中,web.ctx.path
就是/stories
, 而非/admin/stories
。形如:/articles/845protocol
– 所用協議,例如: httpsquery
– 跟在'?'字符後面的查詢字符串。如果不存在查詢參數,它就是一個空字符串。例如: ?fourlegs=good&twolegs=badfullpath
可以視爲path + query
– 包含查詢參數的請求路徑,但不包括'homepath'。例如:/articles/845?fourlegs=good&twolegs=bad
Response
status
– HTTP狀態碼(默認是'200 OK') 401 Unauthorized 未經授權headers
– 包含HTTP頭信息(headers)的二元組列表。output
– 包含響應實體的字符串。