20.22. Cookie — HTTP 状态管理 — Python 文档
20.22. 曲奇饼 — HTTP 状态管理
Cookie 模块定义了用于抽象 cookie 概念的类,cookie 是一种 HTTP 状态管理机制。 它支持简单的仅字符串 cookie,并为将任何可序列化数据类型作为 cookie 值提供抽象。
该模块以前严格应用了 RFC 2109 和 RFC 2068 规范中描述的解析规则。 后来发现,MSIE 3.0x 不遵循这些规范中概述的字符规则,而且当今许多浏览器和服务器在处理 Cookie 时都放宽了解析规则。 因此,使用的解析规则不太严格。
字符集 string.ascii_letters、string.digits 和 !#$%&'*+-.^_`|~
表示该模块在 Cookie 名称中允许的有效字符集(如 key[ X171X])。
- exception Cookie.CookieError
- 由于 RFC 2109 无效,异常失败:不正确的属性、不正确的 Set-Cookie 标头等。
- class Cookie.BaseCookie([input])
这个类是一个类似字典的对象,其键是字符串,其值是 Morsel 实例。 请注意,将键设置为值后,该值首先转换为包含键和值的 Morsel。
如果给出 input,则将其传递给 load() 方法。
- class Cookie.SimpleCookie([input])
- 此类派生自 BaseCookie 并分别将
value_decode()
和value_encode()
覆盖为标识和 str()。
- class Cookie.SerialCookie([input])
此类派生自 BaseCookie 并将
value_decode()
和value_encode()
覆盖为 pickle.loads() 和 pickle.dumps()[ X138X]。自 2.3 版起已弃用: 从不受信任的 cookie 数据中读取腌制值是一个巨大的安全漏洞,因为可以精心制作腌制字符串以导致在您的服务器上执行任意代码。 它仅支持向后兼容,最终可能会消失。
- class Cookie.SmartCookie([input])
此类派生自 BaseCookie。 如果
value_decode()
覆盖为 pickle.loads(),否则为值本身。 它覆盖value_encode()
为 pickle.dumps() 除非它是一个字符串,在这种情况下它返回值本身。自 2.3 版起已弃用:来自 SerialCookie 的相同安全警告适用于此处。
需要进一步的安全说明。 为了向后兼容,Cookie 模块导出一个名为 Cookie
的类,它只是 SmartCookie 的别名。 这可能是一个错误,可能会在未来的版本中被删除。 不应在应用程序中使用 Cookie
类,原因与不应使用 SerialCookie 类的原因相同。
也可以看看
- 模块 cookielib
- Web 客户端 的 HTTP cookie 处理。 cookielib 和 Cookie 模块不相互依赖。
- RFC 2109 - HTTP 状态管理机制
- 这是该模块实现的状态管理规范。
20.22.2. 小物件
- class Cookie.Morsel
抽象一个键/值对,它有一些 RFC 2109 属性。
Morsels 是类似字典的对象,其键集是常量——有效的 RFC 2109 属性,它们是
expires
path
comment
domain
max-age
secure
version
httponly
属性
httponly
指定 cookie 仅在 HTTP 请求中传输,不能通过 JavaScript 访问。 这旨在减轻某些形式的跨站点脚本。键不区分大小写。
2.6 新功能: 增加了
httponly
属性。
- Morsel.value
- cookie 的值。
- Morsel.coded_value
- cookie 的编码值——这是应该发送的。
- Morsel.key
- cookie 的名称。
- Morsel.set(key, value, coded_value)
- 设置 key、value 和 coded_value 属性。
- Morsel.isReservedKey(K)
- K 是否是 Morsel 的键集的成员。
- Morsel.output([attrs[, header]])
- 返回 Morsel 的字符串表示,适合作为 HTTP 标头发送。 默认情况下,包含所有属性,除非给出 attrs,在这种情况下,它应该是要使用的属性列表。 header 默认为
"Set-Cookie:"
。
- Morsel.js_output([attrs])
返回一个可嵌入的 JavaScript 片段,如果在支持 JavaScript 的浏览器上运行,它的行为与发送 HTTP 标头的行为相同。
attrs 的含义与 output() 中的含义相同。
- Morsel.OutputString([attrs])
返回一个表示 Morsel 的字符串,不包含任何 HTTP 或 JavaScript。
attrs 的含义与 output() 中的含义相同。
20.22.3. 例子
以下示例演示如何使用 Cookie 模块。
>>> import Cookie
>>> C = Cookie.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 = Cookie.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 = Cookie.SimpleCookie()
>>> C.load("chips=ahoy; vienna=finger") # load from a string (HTTP header)
>>> print C
Set-Cookie: chips=ahoy
Set-Cookie: vienna=finger
>>> C = Cookie.SimpleCookie()
>>> C.load('keebler="E=everybody; L=\\"Loves\\"; fudge=\\012;";')
>>> print C
Set-Cookie: keebler="E=everybody; L=\"Loves\"; fudge=\012;"
>>> C = Cookie.SimpleCookie()
>>> C["oreo"] = "doublestuff"
>>> C["oreo"]["path"] = "/"
>>> print C
Set-Cookie: oreo=doublestuff; Path=/
>>> C["twix"] = "none for you"
>>> C["twix"].value
'none for you'
>>> C = Cookie.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
>>> # SerialCookie and SmartCookie are deprecated
>>> # using it can cause security loopholes in your code.
>>> C = Cookie.SerialCookie()
>>> C["number"] = 7
>>> C["string"] = "seven"
>>> C["number"].value
7
>>> C["string"].value
'seven'
>>> print C
Set-Cookie: number="I7\012."
Set-Cookie: string="S'seven'\012p1\012."
>>> C = Cookie.SmartCookie()
>>> C["number"] = 7
>>> C["string"] = "seven"
>>> C["number"].value
7
>>> C["string"].value
'seven'
>>> print C
Set-Cookie: number="I7\012."
Set-Cookie: string=seven