http.cookies
--- HTTP狀態(tài)管理?
源代碼: Lib/http/cookies.py
http.cookies
模塊定義的類(lèi)將 cookie 的概念抽象了出來(lái),這是一種 HTTP 狀態(tài)的管理機制。它既支持簡(jiǎn)單的純字符串形式的 cookie,也為任何可序列化數據類(lèi)型的 cookie 提供抽象。
以前,該模塊嚴格套用 RFC 2109 和 RFC 2068 規范中描述的解析規則。后來(lái)人們發(fā)現,MSIE 3.0 并不遵循這些規范中的字符規則,而且目前許多瀏覽器和服務(wù)器在處理 cookie 時(shí)也放寬了解析規則。 因此,這里用到的解析規則沒(méi)有那么嚴格。
字符集 string.ascii_letters
、 string.digits
和 !#$%&'*+-.^_`|~:
給出了本模塊允許出現在 cookie 名稱(chēng)中的有效字符集(如 key
)。
在 3.3 版更改: “:”字符可用于有效的 cookie 名稱(chēng)。
備注
當遇到無(wú)效 cookie 時(shí)會(huì )觸發(fā) CookieError
,所以若 cookie 數據來(lái)自瀏覽器,一定要做好應對無(wú)效數據的準備,并在解析時(shí)捕獲 CookieError
。
- class http.cookies.BaseCookie([input])?
類(lèi)似字典的對象,字典鍵為字符串,字典值是
Morsel
實(shí)例。請注意,在將鍵值關(guān)聯(lián)時(shí),首先會(huì )把值轉換為包含鍵和值的Morsel
對象。若給出 input ,將會(huì )傳給
load()
方法。
- class http.cookies.SimpleCookie([input])?
該類(lèi)派生于
BaseCookie
,并覆蓋了value_decode()
和value_encode()
方法。SimpleCookie 允許用字符串作為 cookie 值。在設置值時(shí),SimpleCookie 將調用內置的str()
將其轉換為字符串。從 HTTP 接收到的值將作為字符串保存。
參見(jiàn)
http.cookiejar
模塊處理網(wǎng)絡(luò ) 客戶(hù)端 的 HTTP cookie。
http.cookiejar
和http.cookies
模塊相互沒(méi)有依賴(lài)關(guān)系。- RFC 2109 - HTTP狀態(tài)管理機制
這是本模塊實(shí)現的狀態(tài)管理規范。
Cookie 對象?
- BaseCookie.value_decode(val)?
由字符串返回元組
(real_value, coded_value)
。real_value
可為任意類(lèi)型。BaseCookie
中的此方法未實(shí)現任何解碼工作——只為能被子類(lèi)重寫(xiě)。
- BaseCookie.value_encode(val)?
返回元組
(real_value, coded_value)
。val 可為任意類(lèi)型,coded_value
則會(huì )轉換為字符串。BaseCookie
中的此方法未實(shí)現任何編碼工作——只為能被子類(lèi)重寫(xiě)。通常在 value_decode 的取值范圍內,
value_encode()
和value_decode()
應為可互逆操作。
- BaseCookie.output(attrs=None, header='Set-Cookie:', sep='\r\n')?
返回可作為 HTTP 標頭信息發(fā)送的字符串表示。 attrs 和 header 會(huì )傳給每個(gè)
Morsel
的output()
方法。 sep 用來(lái)將標頭連接在一起,默認為'\r\n'
(CRLF) 組合。
Morsel 對象?
- class http.cookies.Morsel?
對鍵/值對的抽象,帶有 RFC 2109 的部分屬性。
morsel 對象類(lèi)似于字典,鍵的組成是常量——均為有效的 RFC 2109 屬性,包括:
expires
path
comment
domain
max-age
secure
version
httponly
samesite
httponly
屬性指明了該 cookie 僅在 HTTP 請求中傳輸,且不能通過(guò) JavaScript 訪(fǎng)問(wèn)。這是為了減輕某些跨站腳本攻擊的危害。samesite
屬性指明了瀏覽器不得與跨站請求一起發(fā)送該 cookie。這有助于減輕 CSRF 攻擊的危害。此屬性的有效值為 “Strict”和“Lax”。鍵不區分大小寫(xiě),默認值為
''
。在 3.7 版更改: Attributes
key
,value
andcoded_value
are read-only. Useset()
for setting them.在 3.8 版更改: 增加對
samesite
屬性的支持。
- Morsel.value?
Cookie的值。
- Morsel.coded_value?
編碼后的 cookie 值——也即要發(fā)送的內容。
- Morsel.key?
cookie 名稱(chēng)
- Morsel.set(key, value, coded_value)?
設置 key、value 和 coded_value 屬性。
- Morsel.output(attrs=None, header='Set-Cookie:')?
返回 morsel 的字符串形式,適用于作為 HTTP 頭部信息進(jìn)行發(fā)送。默認包含所有屬性,除非給出 attrs 屬性列表。header 默認為
"Set-Cookie:"
。
- Morsel.js_output(attrs=None)?
返回一段可供嵌入的 JavaScript 代碼,若在支持 JavaScript 的瀏覽器上運行,其作用如同發(fā)送 HTTP 頭部信息一樣。
attrs 的含義與
output()
的相同。
- Morsel.update(values)?
用字典 values 中的值更新 morsel 字典中的值。若有 values 字典中的鍵不是有效的 RFC 2109 屬性,則會(huì )觸發(fā)錯誤。
在 3.5 版更改: 無(wú)效鍵會(huì )觸發(fā)錯誤。
- Morsel.copy(value)?
返回 morsel 對象的淺表復制副本。
在 3.5 版更改: 返回一個(gè) morsel 對象,而非字典。
- Morsel.setdefault(key, value=None)?
若 key 不是有效的 RFC 2109 屬性則觸發(fā)錯誤,否則與
dict.setdefault()
相同。
示例?
以下例子演示了 http.cookies
模塊的用法。
>>> from http import cookies
>>> C = cookies.SimpleCookie()
>>> C["fig"] = "newton"
>>> C["sugar"] = "wafer"
>>> print(C) # generate HTTP headers
Set-Cookie: fig=newton
Set-Cookie: sugar=wafer
>>> print(C.output()) # same thing
Set-Cookie: fig=newton
Set-Cookie: sugar=wafer
>>> C = cookies.SimpleCookie()
>>> C["rocky"] = "road"
>>> C["rocky"]["path"] = "/cookie"
>>> print(C.output(header="Cookie:"))
Cookie: rocky=road; Path=/cookie
>>> print(C.output(attrs=[], header="Cookie:"))
Cookie: rocky=road
>>> C = cookies.SimpleCookie()
>>> C.load("chips=ahoy; vienna=finger") # load from a string (HTTP header)
>>> print(C)
Set-Cookie: chips=ahoy
Set-Cookie: vienna=finger
>>> C = cookies.SimpleCookie()
>>> C.load('keebler="E=everybody; L=\\"Loves\\"; fudge=\\012;";')
>>> print(C)
Set-Cookie: keebler="E=everybody; L=\"Loves\"; fudge=\012;"
>>> C = cookies.SimpleCookie()
>>> C["oreo"] = "doublestuff"
>>> C["oreo"]["path"] = "/"
>>> print(C)
Set-Cookie: oreo=doublestuff; Path=/
>>> C = cookies.SimpleCookie()
>>> C["twix"] = "none for you"
>>> C["twix"].value
'none for you'
>>> C = cookies.SimpleCookie()
>>> C["number"] = 7 # equivalent to C["number"] = str(7)
>>> C["string"] = "seven"
>>> C["number"].value
'7'
>>> C["string"].value
'seven'
>>> print(C)
Set-Cookie: number=7
Set-Cookie: string=seven