web.ctx獲得客戶端信息



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/admin
  • homedomain – 應用所在站點(可以理解爲協議+域名) http://example.org
  • homepath – 當前應用所在的路徑,例如: /admin
  • host – 主機名(域名)+用戶請求的端口(如果沒有的話,就是默認的80端口),例如: example.org,example.org:8080
  • ip – 用戶的IP地址,例如: xxx.xxx.xxx.xxx
  • method – 所用的HTTP方法,例如: GET
  • path – 用戶請求路徑,它是基於當前應用的相對路徑。在子應用中,匹配外部應用的那部分網址將被去掉。例如:主應用在code.py中,而子應用在admin.py中。在code.py中, 我們將/admin關聯到admin.app。 在admin.py中, 將/stories關聯到stories類。在stories中, web.ctx.path就是/stories, 而非/admin/stories。形如:/articles/845
  • protocol – 所用協議,例如: https
  • query – 跟在'?'字符後面的查詢字符串。如果不存在查詢參數,它就是一個空字符串。例如: ?fourlegs=good&twolegs=bad
  • fullpath 可以視爲 path + query – 包含查詢參數的請求路徑,但不包括'homepath'。例如:/articles/845?fourlegs=good&twolegs=bad

Response

  • status – HTTP狀態碼(默認是'200 OK') 401 Unauthorized 未經授權
  • headers – 包含HTTP頭信息(headers)的二元組列表。
  • output – 包含響應實體的字符串。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章