詳解Python中的Cookie模塊使用
最近在用GAE開發(fā)自己的博客程序。雖然GAE的API沒有顯式的提供操作Cookie的方法,但他現(xiàn)有的架構(gòu),使我們有足夠的自由來操作Cookie。
Cookie 模塊,顧名思義,就是用來操作Cookie的模塊。Cookie這塊小蛋糕,玩過Web的人都知道,它是Server與Client保持會話時用到的信息 切片。 Http協(xié)議本身是無狀態(tài)的,也就是說,同一個客戶端發(fā)送的兩次請求,對于Web服務(wù)器來說,沒有直接的關(guān)系。既然這樣,有人會問,既然Http是無狀態(tài) 的, 為什么有些網(wǎng)頁,只有輸入了用戶名與密碼通過驗證之后才可以訪問?那是因為:對于通過身份驗證的用戶,Server會偷偷的在發(fā)往Client的數(shù)據(jù)中添 加 Cookie,Cookie中一般保存一個標識該Client的唯一的ID,Client在接下來對服務(wù)器的請求中,會將該ID以Cookie的形式一并 發(fā)往Server,Server從回傳回來的Cookie中提取ID并與相應(yīng)的用戶綁定起來,從而實現(xiàn)身份驗證。說白了,Cookie就是一個在服務(wù)器與客戶端之間相互傳遞的字符串(下圖通過FireFox的FireBug插件查看訪問google.com時的Cookie)。 越扯越遠了,回到我們的主題:Python標準模塊 — Cookie。
(上圖是Http請求頭中的Cookie信息)
(上圖是Http響應(yīng)中的Cookie信息)
Cooke模塊中定義了4個直接操作Cookie的類:BaseCookie、SimpleCookie、SerialCookie、 SmartCookie。其中,BaseCookie是基類,定義了操作Cookie的公共部分,其他3個類都繼承自BaseCookie,它們之間的區(qū) 別僅僅在于序列化數(shù)據(jù)的方式不同。下面簡單講解這些類的使用。
BaseCookie基類: BaseCookies的行為非常像dict,可以用鍵/值對的形式來操作它,但是kye必須是字符串,value是Morsel對象 (下面會講到Morsel)。BaseCookies定義了編碼/解碼,輸入/輸出操作的公共規(guī)范:
BaseCookie.value_encode(val):對數(shù)據(jù)進行序列化/反序列化。這些方法都返回字符串,以便通過Http傳輸。
BaseCookie.output():返回字符串,該字符串可以作為Http響應(yīng)頭發(fā)往客戶端。
BaseCookie.js_output():返回嵌入js腳本的字符串,瀏覽器通過執(zhí)行該腳本,就可以得到cooke數(shù)據(jù)。
BaseCookie.load(newdata):解析字符串為Cookie數(shù)據(jù)。
SimpleCookie、SerialCookie、SmartCookie都繼承自BaseCookie,具有一致的行為,它們各自對 BaseCookie的value_decode, value_encode進行了重寫并實現(xiàn)自己的序列化/反序列化策略,其中:
- SimpleCookie內(nèi)部使用str()來對數(shù)據(jù)進行序列化;
- SerialCookie則通過pickle模塊來序列化反序列化數(shù)據(jù);
- SmartCookie相對聰明點,對于非字符串?dāng)?shù)據(jù),使用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() # 輸出結(jié)果,與上圖對照 # 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中每一項數(shù)據(jù)的屬性而抽象的類。這些屬性包括:expires, path, comment, domain, max-age, secure, version等等(看上圖下劃線標注部分)。如果你玩過web,對這些應(yīng)該不會陌生,可以在RCF2109中找到他們的具體定義
Morsel.key,Morsel.value:Cookie數(shù)據(jù)項的key/value(value可以是二進制數(shù)據(jù));
Morsel.coded_value:數(shù)據(jù)編碼后得到的字符串。Http協(xié)議是基于文本的協(xié)議,Server無法直接向Client發(fā)送二進制數(shù)據(jù),只有序列化成字符串后,才能發(fā)往Client;
Morsel.set(key, value, coded_value):設(shè)置Cookie數(shù)據(jù)項的key、value、coded_value;
Morsel.isReversvedKey(key):如果key是expires, path, comment, domain, max-age, secure, version, httponly中的一個,返回True,否則返回False;
Morsel.output():返回型如“Set-Cookie: …”的字符串,表示一個Cookie數(shù)據(jù)項;
Morsel.js_output():返回Cookie數(shù)據(jù)項的腳本字符串;
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() # 結(jié)果 # Set-Cookie: name=DarkBull; Domain=appspot.com; expires=Fir, 01-Oct-2010 20:00:00
- python處理cookie詳解
- Python模仿POST提交HTTP數(shù)據(jù)及使用Cookie值的方法
- 使用Python中的cookielib模擬登錄網(wǎng)站
- python使用cookielib庫示例分享
- python使用urllib2實現(xiàn)發(fā)送帶cookie的請求
- Python爬蟲利用cookie實現(xiàn)模擬登陸實例詳解
- python模擬登錄并且保持cookie的方法詳解
- 詳解Python的Django框架中的Cookie相關(guān)處理
- python使用cookie庫操保存cookie詳解
- python cookielib 登錄人人網(wǎng)的實現(xiàn)代碼
- 玩轉(zhuǎn)python爬蟲之cookie使用方法
- python3實現(xiàn)讀取chrome瀏覽器cookie
- 利用selenium 3.7和python3添加cookie模擬登陸的實現(xiàn)
- Python中urllib+urllib2+cookielib模塊編寫爬蟲實戰(zhàn)
- Python基于PycURL自動處理cookie的方法
- 在Python中使用cookielib和urllib2配合PyQuery抓取網(wǎng)頁信息
- Python使用cookielib模塊操作cookie的實例教程
- Python get獲取頁面cookie代碼實例
相關(guān)文章
詳解利用python-highcharts庫繪制交互式可視化圖表
本文主要和大家分享一個超強交互式可視化繪制工具-python-highcharts。python-highcharts就是使用Python進行Highcharts項目繪制,簡單的說就是實現(xiàn)Python和Javascript之間的簡單轉(zhuǎn)換層,感興趣的可以了解一下2022-03-03Python網(wǎng)絡(luò)爬蟲信息提取mooc代碼實例
這篇文章主要介紹了python網(wǎng)絡(luò)爬蟲與信息提取mooc,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03python使用pygame模塊實現(xiàn)坦克大戰(zhàn)游戲
這篇文章主要為大家詳細介紹了python使用pygame模塊實現(xiàn)坦克大戰(zhàn)游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05Python?pygame派生精靈和精靈組創(chuàng)建敵機
這篇文章主要為大家介紹了Python?pygame派生精靈和精靈組創(chuàng)建敵機示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08Python語法學(xué)習(xí)之進程的創(chuàng)建與常用方法詳解
本文我們將學(xué)習(xí)一下在?Python?中去創(chuàng)建并使用多進程的方法,可以通過創(chuàng)建多個進程來幫助我們提高腳本執(zhí)行的效率,感興趣的可以了解一下2022-04-04