http.cookies — HTTP 状态管理

源代码: Lib/http/cookies.py


http.cookies 模块定义了一些类,用于抽象 Cookie 的概念,这是一种 HTTP 状态管理机制。它既支持简单的仅字符串 Cookie,也提供了一种抽象,可以将任何可序列化数据类型作为 Cookie 值。

该模块以前严格应用了 RFC 2109RFC 2068 规范中描述的解析规则。后来发现,MSIE 3.0x 没有遵循这些规范中概述的字符规则;许多当今的浏览器和服务器在处理 Cookie 时也放宽了解析规则。因此,该模块现在使用的解析规则比以前稍微宽松一些。

字符集,string.ascii_lettersstring.digits!#$%&'*+-.^_`|~: 表示此模块在 Cookie 名称(作为 key)中允许的有效字符集。

在 3.3 版更改: 允许使用 ':' 作为有效的 Cookie 名称字符。

注意

当遇到无效的 Cookie 时,会引发 CookieError,因此,如果您的 Cookie 数据来自浏览器,您应该始终准备好处理无效数据,并在解析时捕获 CookieError

异常 http.cookies.CookieError

由于 RFC 2109 无效而失败的异常:不正确的属性、不正确的 Set-Cookie 标头等。

http.cookies.BaseCookie([input])

此类是一个类似字典的对象,其键是字符串,其值是 Morsel 实例。请注意,在将键设置为值时,该值首先被转换为包含该键和值的 Morsel

如果给出了 input,则将其传递给 load() 方法。

http.cookies.SimpleCookie([input])

此类派生自 BaseCookie 并覆盖了 value_decode()value_encode()SimpleCookie 支持将字符串作为 Cookie 值。在设置值时,SimpleCookie 会调用内置的 str() 将值转换为字符串。从 HTTP 接收的值将保留为字符串。

参见

模块 http.cookiejar

用于 Web 客户端 的 HTTP Cookie 处理。http.cookiejarhttp.cookies 模块彼此不依赖。

RFC 2109 - HTTP 状态管理机制

这是此模块实现的状态管理规范。

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 指定不允许浏览器将 cookie 与跨站点请求一起发送。 这有助于减少 CSRF 攻击。 此属性的有效值为“Strict”和“Lax”。

键不区分大小写,默认值为 ''

在 3.5 版更改: __eq__() 现在将 keyvalue 考虑在内。

在 3.7 版更改: 属性 keyvaluecoded_value 是只读的。 使用 set() 来设置它们。

在 3.8 版更改: 添加了对 samesite 属性的支持。

Morsel.value

cookie 的值。

Morsel.coded_value

cookie 的编码值——这是应该发送的值。

Morsel.key

cookie 的名称。

Morsel.set(key, value, coded_value)

设置 keyvaluecoded_value 属性。

Morsel.isReservedKey(K)

K 是否是 Morsel 键集的成员。

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