Python中的Cookie模塊如何使用
Cookie 模塊,顧名思義,就是用來(lái)操作Cookie的模塊。
Cookie這塊小蛋糕,玩過(guò)Web的人都知道,它是Server與Client保持會(huì)話時(shí)用到的信息 切片。 Http協(xié)議本身是無(wú)狀態(tài)的,也就是說(shuō),同一個(gè)客戶端發(fā)送的兩次請(qǐng)求,對(duì)于Web服務(wù)器來(lái)說(shuō),沒(méi)有直接的關(guān)系。既然這樣,有人會(huì)問(wèn),既然Http是無(wú)狀態(tài) 的, 為什么有些網(wǎng)頁(yè),只有輸入了用戶名與密碼通過(guò)驗(yàn)證之后才可以訪問(wèn)?
那是因?yàn)椋簩?duì)于通過(guò)身份驗(yàn)證的用戶,Server會(huì)偷偷的在發(fā)往Client的數(shù)據(jù)中添 加 Cookie,Cookie中一般保存一個(gè)標(biāo)識(shí)該Client的唯一的ID,Client在接下來(lái)對(duì)服務(wù)器的請(qǐng)求中,會(huì)將該ID以Cookie的形式一并 發(fā)往Server,Server從回傳回來(lái)的Cookie中提取ID并與相應(yīng)的用戶綁定起來(lái),從而實(shí)現(xiàn)身份驗(yàn)證。說(shuō)白了,Cookie就是一個(gè)在服務(wù)器與客戶端之間相互傳遞的字符串(下圖通過(guò)FireFox的FireBug插件查看訪問(wèn)google.com時(shí)的Cookie)。
Cooke模塊中定義了4個(gè)直接操作Cookie的類(lèi):BaseCookie、SimpleCookie、SerialCookie、 SmartCookie。其中,BaseCookie是基類(lèi),定義了操作Cookie的公共部分,其他3個(gè)類(lèi)都繼承自BaseCookie,它們之間的區(qū) 別僅僅在于序列化數(shù)據(jù)的方式不同。下面簡(jiǎn)單講解這些類(lèi)的使用。
BaseCookie基類(lèi): BaseCookies的行為非常像dict,可以用鍵/值對(duì)的形式來(lái)操作它,但是kye必須是字符串,value是Morsel對(duì)象 (下面會(huì)講到Morsel)。BaseCookies定義了編碼/解碼,輸入/輸出操作的公共規(guī)范:
- BaseCookie.value_encode(val):對(duì)數(shù)據(jù)進(jìn)行序列化/反序列化。這些方法都返回字符串,以便通過(guò)Http傳輸。
- BaseCookie.output():返回字符串,該字符串可以作為Http響應(yīng)頭發(fā)往客戶端。
- BaseCookie.js_output():返回嵌入js腳本的字符串,瀏覽器通過(guò)執(zhí)行該腳本,就可以得到cooke數(shù)據(jù)。
- BaseCookie.load(newdata):解析字符串為Cookie數(shù)據(jù)。
SimpleCookie、SerialCookie、SmartCookie都繼承自BaseCookie,具有一致的行為,它們各自對(duì) BaseCookie的value_decode, value_encode進(jìn)行了重寫(xiě)并實(shí)現(xiàn)自己的序列化/反序列化策略,其中:
SimpleCookie內(nèi)部使用str()來(lái)對(duì)數(shù)據(jù)進(jìn)行序列化;
SerialCookie則通過(guò)pickle模塊來(lái)序列化反序列化數(shù)據(jù);
SmartCookie相對(duì)聰明點(diǎn),對(duì)于非字符串?dāng)?shù)據(jù),使用pickle序列/反序列化,否則將字符串原樣返回。
下面的例子簡(jiǎn)單的說(shuō)明如何使用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' # 過(guò)期時(shí)間 print c.output() print c.js_output() # 輸出結(jié)果,與上圖對(duì)照 # 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類(lèi) : 用于表示Cookie中每一項(xiàng)數(shù)據(jù)的屬性而抽象的類(lèi)。這些屬性包括:expires, path, comment, domain, max-age, secure, version等等(看上圖下劃線標(biāo)注部分)。如果你玩過(guò)web,對(duì)這些應(yīng)該不會(huì)陌生,可以在RCF2109中找到他們的具體定義
Morsel.key,Morsel.value:Cookie數(shù)據(jù)項(xiàng)的key/value(value可以是二進(jìn)制數(shù)據(jù));
Morsel.coded_value:數(shù)據(jù)編碼后得到的字符串。Http協(xié)議是基于文本的協(xié)議,Server無(wú)法直接向Client發(fā)送二進(jìn)制數(shù)據(jù),只有序列化成字符串后,才能發(fā)往Client;
Morsel.set(key, value, coded_value):設(shè)置Cookie數(shù)據(jù)項(xiàng)的key、value、coded_value;
Morsel.isReversvedKey(key):如果key是expires, path, comment, domain, max-age, secure, version, httponly中的一個(gè),返回True,否則返回False;
Morsel.output():返回型如“Set-Cookie: …”的字符串,表示一個(gè)Cookie數(shù)據(jù)項(xiàng);
Morsel.js_output():返回Cookie數(shù)據(jù)項(xiàng)的腳本字符串;
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
知識(shí)點(diǎn)擴(kuò)展:
為什么要使用Cookie呢?
Cookie,指某些網(wǎng)站為了辨別用戶身份、進(jìn)行session跟蹤而儲(chǔ)存在用戶本地終端上的數(shù)據(jù)(通常經(jīng)過(guò)加密)
比如說(shuō)有些網(wǎng)站需要登錄后才能訪問(wèn)某個(gè)頁(yè)面,在登錄之前,你想抓取某個(gè)頁(yè)面內(nèi)容是不允許的。那么我們可以利用Urllib2庫(kù)保存我們登錄的Cookie,然后再抓取其他頁(yè)面就達(dá)到目的了。
以上就是Python中的Cookie模塊如何使用的詳細(xì)內(nèi)容,更多關(guān)于Python中的Cookie模塊用法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python中把元組轉(zhuǎn)換為namedtuple方法
在本篇文章里小編給大家整理的是一篇關(guān)于python中把元組轉(zhuǎn)換為namedtuple方法,有興趣的朋友們可以參考下。2020-12-12
python中os和sys模塊的區(qū)別與常用方法總結(jié)
這篇文章主要給大家介紹了關(guān)于python中os和sys模塊的區(qū)別與常用方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
Pytorch從0實(shí)現(xiàn)Transformer的實(shí)踐
本文主要介紹了Pytorch從0實(shí)現(xiàn)Transformer的實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
通過(guò)python的matplotlib包將Tensorflow數(shù)據(jù)進(jìn)行可視化的方法
今天小編就為大家分享一篇通過(guò)python的matplotlib包將Tensorflow數(shù)據(jù)進(jìn)行可視化的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
Python爬蟲(chóng)基礎(chǔ)講解之請(qǐng)求
今天帶大家了解一下python爬蟲(chóng)的基礎(chǔ)知識(shí),文中有非常詳細(xì)的解釋說(shuō)明,對(duì)正在學(xué)習(xí)python爬蟲(chóng)的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05
python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5打印控件QPrinter詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5打印控件QPrinter詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-02-02

