http.cookies
— HTTP 狀態管理¶
原始碼: Lib/http/cookies.py
http.cookies
模組定義了用於抽象 cookie 概念的類,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 狀態管理機制
這是此模組實現的狀態管理規範。
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”。鍵不區分大小寫,其預設值為
''
。在 3.7 版本中更改: 屬性
key
,value
和coded_value
是隻讀的。請使用set()
來設定它們。在 3.8 版本中更改: 增加了對
samesite
屬性的支援。
- 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)¶
如果鍵不是有效的 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