1. 程式人生 > 程式設計 >Python中的Cookie模組如何使用

Python中的Cookie模組如何使用

Cookie 模組,顧名思義,就是用來操作Cookie的模組。

Cookie這塊小蛋糕,玩過Web的人都知道,它是Server與Client保持會話時用到的資訊 切片。 Http協議本身是無狀態的,也就是說,同一個客戶端傳送的兩次請求,對於Web伺服器來說,沒有直接的關係。既然這樣,有人會問,既然Http是無狀態 的, 為什麼有些網頁,只有輸入了使用者名稱與密碼通過驗證之後才可以訪問?

那是因為:對於通過身份驗證的使用者,Server會偷偷的在發往Client的資料中添 加 Cookie,Cookie中一般儲存一個標識該Client的唯一的ID,Client在接下來對伺服器的請求中,會將該ID以Cookie的形式一併 發往Server,Server從回傳回來的Cookie中提取ID並與相應的使用者繫結起來,從而實現身份驗證。說白了,Cookie就是一個在伺服器與客戶端之間相互傳遞的字串(下圖通過FireFox的FireBug外掛檢視訪問google.com時的Cookie)。

Cooke模組中定義了4個直接操作Cookie的類:BaseCookie、SimpleCookie、SerialCookie、 SmartCookie。其中,BaseCookie是基類,定義了操作Cookie的公共部分,其他3個類都繼承自BaseCookie,它們之間的區 別僅僅在於序列化資料的方式不同。下面簡單講解這些類的使用。

BaseCookie基類: BaseCookies的行為非常像dict,可以用鍵/值對的形式來操作它,但是kye必須是字串,value是Morsel物件 (下面會講到Morsel)。BaseCookies定義了編碼/解碼,輸入/輸出操作的公共規範:

  • BaseCookie.value_encode(val):對資料進行序列化/反序列化。這些方法都返回字串,以便通過Http傳輸。
  • BaseCookie.output():返回字串,該字串可以作為Http響應頭髮往客戶端。
  • BaseCookie.js_output():返回嵌入js指令碼的字串,瀏覽器通過執行該指令碼,就可以得到cooke資料。
  • BaseCookie.load(newdata):解析字串為Cookie資料。

SimpleCookie、SerialCookie、SmartCookie都繼承自BaseCookie,具有一致的行為,它們各自對 BaseCookie的value_decode,value_encode進行了重寫並實現自己的序列化/反序列化策略,其中:

SimpleCookie內部使用str()來對資料進行序列化;

SerialCookie則通過pickle模組來序列化反序列化資料;

SmartCookie相對聰明點,對於非字串資料,使用pickle序列/反序列化,否則將字串原樣返回。

下面的例子簡單的說明如何使用Cookie模組:

import Cookie
c = Cookie.SimpleCookie()
c['name'] = 'DarkBull'
c['address'] = 'ChinaHangZhou'
c['address']['path'] = '/'
# 路徑
c['address']['domain'] = 'appspot.com'
# domain
c['address']['expires'] = 'Fir,01-Oct-2010 20:00:00 GMT' 
# 過期時間
print c.output()
print c.js_output()
# 輸出結果,與上圖對照
# Set-Cookie: address=ChinaHangZhou; Domain=appspot.com; expires=Fir,01-Oct-2010 20:00:00 GMT; Path=/
# Set-Cookie: name=DarkBull
# 作為指令碼輸出
# <script type="text/javascript">
# document.cookie = "address=ChinaHangZhou; Domain=appspot.com; expires=Fir,01-Oct-2010 20:00:00 GMT; Path=/";
# </script>
# <script type="text/javascript">
# document.cookie = "name=DarkBull";
# </script>

Morsel類 : 用於表示Cookie中每一項資料的屬性而抽象的類。這些屬性包括:expires,path,comment,domain,max-age,secure,version等等(看上圖下劃線標註部分)。如果你玩過web,對這些應該不會陌生,可以在RCF2109中找到他們的具體定義

Morsel.key,Morsel.value:Cookie資料項的key/value(value可以是二進位制資料);

Morsel.coded_value:資料編碼後得到的字串。Http協議是基於文字的協議,Server無法直接向Client傳送二進位制資料,只有序列化成字串後,才能發往Client;

Morsel.set(key,value,coded_value):設定Cookie資料項的key、value、coded_value;

Morsel.isReversvedKey(key):如果key是expires,version,httponly中的一個,返回True,否則返回False;

Morsel.output():返回型如“Set-Cookie: …”的字串,表示一個Cookie資料項;

Morsel.js_output():返回Cookie資料項的指令碼字串;

Morsel.OutputString(): 返回Morsel的字串表示;

Morsel使用示例:

import Cookie
m = Cookie.Morsel()
m.set('name','DarkBull','DarkBull')
m['expires'] = 'Fir,01-Oct-2010 20:00:00 GMT'
m['domain'] = 'appspot.com'
print m.output()
# 結果
# Set-Cookie: name=DarkBull; Domain=appspot.com; expires=Fir,01-Oct-2010 20:00:00

知識點擴充套件:

為什麼要使用Cookie呢?

Cookie,指某些網站為了辨別使用者身份、進行session跟蹤而儲存在使用者本地終端上的資料(通常經過加密)

比如說有些網站需要登入後才能訪問某個頁面,在登入之前,你想抓取某個頁面內容是不允許的。那麼我們可以利用Urllib2庫儲存我們登入的Cookie,然後再抓取其他頁面就達到目的了。

以上就是Python中的Cookie模組如何使用的詳細內容,更多關於Python中的Cookie模組用法的資料請關注我們其它相關文章!