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
。
- 类 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.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_encode()
和value_decode()
应该是 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