http.cookies --- HTTP狀態(tài)管理?

源代碼: Lib/http/cookies.py


http.cookies 模塊定義的類將 cookie 的概念抽象了出來,這是一種 HTTP 狀態(tài)的管理機制。它既支持簡單的純字符串形式的 cookie,也為任何可序列化數據類型的 cookie 提供抽象。

以前,該模塊嚴格套用 RFC 2109RFC 2068 規(guī)范中描述的解析規(guī)則。后來人們發(fā)現,MSIE 3.0 并不遵循這些規(guī)范中的字符規(guī)則,而且目前許多瀏覽器和服務器在處理 cookie 時也放寬了解析規(guī)則。 因此,這里用到的解析規(guī)則沒有那么嚴格。

字符集 string.ascii_letters 、 string.digits!#$%&'*+-.^_`|~: 給出了本模塊允許出現在 cookie 名稱中的有效字符集(如 key)。

在 3.3 版更改: “:”字符可用于有效的 cookie 名稱。

備注

當遇到無效 cookie 時會觸發(fā) CookieError,所以若 cookie 數據來自瀏覽器,一定要做好應對無效數據的準備,并在解析時捕獲 CookieError。

exception http.cookies.CookieError?

出現異常的原因,可能是不符合 RFC 2109 :屬性不正確、Set-Cookie 頭部信息不正確等等。

class http.cookies.BaseCookie([input])?

類似字典的對象,字典鍵為字符串,字典值是 Morsel 實例。請注意,在將鍵值關聯(lián)時,首先會把值轉換為包含鍵和值的 Morsel 對象。

若給出 input ,將會傳給 load() 方法。

class http.cookies.SimpleCookie([input])?

該類派生于 BaseCookie,并覆蓋了 value_decode()value_encode() 方法。SimpleCookie 允許用字符串作為 cookie 值。在設置值時,SimpleCookie 將調用內置的 str() 將其轉換為字符串。從 HTTP 接收到的值將作為字符串保存。

參見

http.cookiejar 模塊

處理網絡 客戶端 的 HTTP cookie。 http.cookiejarhttp.cookies 模塊相互沒有依賴關系。

RFC 2109 - HTTP狀態(tài)管理機制

這是本模塊實現的狀態(tài)管理規(guī)范。

Morsel 對象?

class http.cookies.Morsel?

對鍵/值對的抽象,帶有 RFC 2109 的部分屬性。

morsel 對象類似于字典,鍵的組成是常量——均為有效的 RFC 2109 屬性,包括:

  • expires

  • path

  • comment

  • domain

  • max-age

  • secure

  • version

  • httponly

  • samesite

httponly 屬性指明了該 cookie 僅在 HTTP 請求中傳輸,且不能通過 JavaScript 訪問。這是為了減輕某些跨站腳本攻擊的危害。

samesite 屬性指明了瀏覽器不得與跨站請求一起發(fā)送該 cookie。這有助于減輕 CSRF 攻擊的危害。此屬性的有效值為 “Strict”和“Lax”。

鍵不區(qū)分大小寫,默認值為 ''。

在 3.5 版更改: 現在,__eq__() 會同時考慮 keyvalue 。

在 3.7 版更改: Attributes key, value and coded_value are read-only. Use set() for setting them.

在 3.8 版更改: 增加對 samesite 屬性的支持。

Morsel.value?

Cookie的值。

Morsel.coded_value?

編碼后的 cookie 值——也即要發(fā)送的內容。

Morsel.key?

cookie 名稱

Morsel.set(key, value, coded_value)?

設置 key、valuecoded_value 屬性。

Morsel.isReservedKey(K)?

判斷 K 是否屬于 Morsel 的鍵。

Morsel.output(attrs=None, header='Set-Cookie:')?

返回 morsel 的字符串形式,適用于作為 HTTP 頭部信息進行發(fā)送。默認包含所有屬性,除非給出 attrs 屬性列表。header 默認為 "Set-Cookie:"。

Morsel.js_output(attrs=None)?

返回一段可供嵌入的 JavaScript 代碼,若在支持 JavaScript 的瀏覽器上運行,其作用如同發(fā)送 HTTP 頭部信息一樣。

attrs 的含義與 output() 的相同。

Morsel.OutputString(attrs=None)?

返回 morsel 的字符串形式,不含 HTTP 或 JavaScript 數據。

attrs 的含義與 output() 的相同。

Morsel.update(values)?

用字典 values 中的值更新 morsel 字典中的值。若有 values 字典中的鍵不是有效的 RFC 2109 屬性,則會觸發(fā)錯誤。

在 3.5 版更改: 無效鍵會觸發(fā)錯誤。

Morsel.copy(value)?

返回 morsel 對象的淺表復制副本。

在 3.5 版更改: 返回一個 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