python模組學習 —- Cookie

來源:互聯網
上載者:User

    最近在用GAE開發自己的部落格程式。雖然GAE的API沒有顯式的提供操作Cookie的方法,但他現有的架構,使我們有足夠的自由來操作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)。
越扯越遠了,回到我們的主題:Python標準模組 -- Cookie。

(是Http要求標頭中的Cookie資訊)

(是Http響應中的Cookie資訊)

   
Cooke模組中定義了4個直接操作Cookie的類:BaseCookie、SimpleCookie、SerialCookie、
SmartCookie。其中,BaseCookie是基類,定義了操作Cookie的公用部分,其他3個類都繼承自BaseCookie,它們之間的區
別僅僅在於序列化資料的方式不同。下面簡單講解這些類的使用。
    BaseCookie基類:
BaseCookies的行為非常像dict,可以用鍵/值對的形式來操作它,但是kye必須是字串,value是Morsel對象
(下面會講到Morsel)。BaseCookies定義了編碼/解碼,輸入/輸出操作的公用規範:

    BaseCookie.value_decode(val)
    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, path, comment, domain, max-age, secure, 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 GMT

    關於Cookie模組更詳細的內容,可以Python手冊。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.