http.cookies — HTTP 狀態管理¶
原始碼: Lib/http/cookies.py
http.cookies 模組定義了多個類,用於對 cookie 這一 HTTP 狀態管理機制進行抽象。它支援純字串 cookie,並提供了一種抽象,允許將任何可序列化的資料型別用作 cookie 值。
該模組最初嚴格遵循 RFC 2109 和 RFC 2068 規範中描述的解析規則。後來發現 MSIE 3.0x 並未遵循這些規範中列出的字元規則;如今許多瀏覽器和伺服器在處理 cookie 時也放寬了解析規則。因此,該模組現在使用的解析規則比以前稍寬鬆一些。
字元集 string.ascii_letters、string.digits 和 !#$%&'*+-.^_`|~: 表示本模組允許在 cookie 名稱(作為 key)中使用的有效字元集合。
在 3.3 版更改: 允許 ':' 作為有效的 cookie 名稱字元。
備註
遇到無效 cookie 時,會引發 CookieError,所以如果你的 cookie 資料來自瀏覽器,應始終做好應對無效資料的準備,並在解析時捕獲 CookieError。
- class http.cookies.BaseCookie([input])¶
此類是一個類似字典的物件,其鍵是字串,值是
Morsel例項。請注意,在為鍵設定值時,值會首先被轉換為一個包含該鍵和值的Morsel。如果提供了 input,它將被傳遞給
load()方法。
- class http.cookies.SimpleCookie([input])¶
該類派生自
BaseCookie並重寫了value_decode()和value_encode()。SimpleCookie支援將字串作為 cookie 值。設定值時,SimpleCookie會呼叫內建的str()將值轉換為字串。從 HTTP 接收到的值將保持為字串。
參見
http.cookiejar模組用於 Web 客戶端 的 HTTP cookie 處理。
http.cookiejar和http.cookies模組彼此獨立。- RFC 2109 - HTTP State Management Mechanism
這是本模組所實現的狀態管理規範。
Cookie 物件¶
- BaseCookie.value_decode(val)¶
從字串表示形式返回一個元組
(real_value, coded_value)。real_value可以是任何型別。此方法在BaseCookie中不執行任何解碼操作——它的存在是為了被重寫。
- BaseCookie.value_encode(val)¶
返回一個元組
(real_value, coded_value)。val 可以是任何型別,但coded_value將始終被轉換為字串。此方法在BaseCookie中不執行任何編碼操作——它的存在是為了被重寫。通常情況下,在 value_decode 的值域上,
value_encode()和value_decode()應該是互逆的。
- BaseCookie.output(attrs=None, header='Set-Cookie:', sep='\r\n')¶
返回一個適合作為 HTTP 標頭髮送的字串表示形式。attrs 和 header 會被髮送到每個
Morsel的output()方法。sep 用於連線各個標頭,預設為'\r\n'(CRLF) 組合。
Morsel 物件¶
- class http.cookies.Morsel¶
抽象了一個鍵/值對,它具有一些 RFC 2109 屬性。
Morsel 是類似字典的物件,其鍵集是固定的——即有效的 RFC 2109 屬性,它們是
httponly屬性指定 cookie 僅在 HTTP 請求中傳輸,並且不能透過 JavaScript 訪問。這旨在減輕某些形式的跨站指令碼攻擊。samesite屬性控制瀏覽器何時隨跨站請求傳送 cookie。這有助於緩解 CSRF 攻擊。有效值為 "Strict"(僅隨同站請求傳送)、"Lax"(隨同站請求和頂級導航傳送)和 "None"(隨同站和跨站請求傳送)。使用 "None" 時,還必須設定 "secure" 屬性,這是現代瀏覽器的要求。partitioned屬性向使用者代理表明,這些跨站 cookie 應該只在首次設定 cookie 的同一頂級上下文中可用。為了讓使用者代理接受此設定,你必須同時設定Secure。此外,建議在設定分割槽 cookie 時使用
__Host字首,使其繫結到主機名而不是可註冊域。請閱讀 CHIPS (Cookies Having Independent Partitioned State) 以獲取完整細節和示例。鍵名不區分大小寫,其預設值為
''。在 3.7 版更改: 屬性
key、value和coded_value是隻讀的。請使用set()來設定它們。在 3.8 版更改: 添加了對
samesite屬性的支援。在 3.14 版更改: 添加了對
partitioned屬性的支援。
- Morsel.value¶
cookie 的值。
- Morsel.coded_value¶
cookie 的編碼值——這是應該被髮送的內容。
- Morsel.key¶
cookie 的名稱。
- Morsel.set(key, value, coded_value)¶
設定 key、value 和 coded_value 屬性。
- Morsel.output(attrs=None, header='Set-Cookie:')¶
返回 Morsel 的字串表示形式,適合作為 HTTP 標頭髮送。預設情況下,包含所有屬性,除非提供了 attrs,此時它應該是一個要使用的屬性列表。header 預設為
"Set-Cookie:"。
- Morsel.js_output(attrs=None)¶
返回一個可嵌入的 JavaScript 程式碼片段,如果在支援 JavaScript 的瀏覽器上執行,其效果與傳送 HTTP 標頭相同。
attrs 的含義與在
output()中的含義相同。
- Morsel.OutputString(attrs=None)¶
返回表示 Morsel 的字串,不帶任何周圍的 HTTP 或 JavaScript 程式碼。
attrs 的含義與在
output()中的含義相同。
- Morsel.update(values)¶
使用字典 values 中的值更新 Morsel 字典中的值。如果 values 字典中的任何鍵不是有效的 RFC 2109 屬性,則引發錯誤。
在 3.5 版更改: 對無效鍵會引發錯誤。
- Morsel.copy(value)¶
返回 Morsel 物件的淺複製。
在 3.5 版更改: 返回一個 Morsel 物件而不是一個字典。
- Morsel.setdefault(key, value=None)¶
如果 key 不是有效的 RFC 2109 屬性,則引發錯誤,否則其行為與
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