21.23. http.cookies — HTTP状态管理¶
源代码: Lib/http/cookies.py
http.cookies 模块定义的类将 cookie 的概念抽象了出来,这是一种 HTTP 状态的管理机制。它既支持简单的纯字符串形式的 cookie,也为任何可序列化数据类型的 cookie 提供抽象。
以前,该模块严格套用 RFC 2109 和 RFC 2068 规范中描述的解析规则。后来人们发现,MSIE 3.0 并不遵循这些规范中的字符规则,而且目前许多浏览器和服务器在处理 cookie 时也放宽了解析规则。 因此,这里用到的解析规则没有那么严格。
字符集 string.ascii_letters 、 string.digits 和 !#$%&'*+-.^_`|~: 给出了本模块允许出现在 cookie 名称中的有效字符集(如 key)。
在 3.3 版更改: “:”字符可用于有效的 cookie 名称。
注解
当遇到无效 cookie 时会触发 CookieError,所以若 cookie 数据来自浏览器,一定要做好应对无效数据的准备,并在解析时捕获 CookieError。
出现异常的原因,可能是不符合 RFC 2109 :属性不正确、Set-Cookie 头部信息不正确等等。
This class derives from
BaseCookieand overridesvalue_decode()andvalue_encode()to be the identity andstr()respectively.
参见
http.cookiejar模块处理网络 客户端 的 HTTP cookie。
http.cookiejar和http.cookies模块相互没有依赖关系。- RFC 2109 - HTTP状态管理机制
这是本模块实现的状态管理规范。
21.23.1. Cookie 对象¶
Return a decoded value from a string representation. Return value can be any type. This method does nothing in
BaseCookie— it exists so it can be overridden.
Return an encoded value. val can be any type, but return value must be a string. This method does nothing in
BaseCookie— it exists so it can be overridden.通常在 value_decode 的取值范围内,
value_encode()和value_decode()应为可互逆操作。
返回可作为 HTTP 标头信息发送的字符串表示。 attrs 和 header 会传给每个
Morsel的output()方法。 sep 用来将标头连接在一起,默认为'\r\n'(CRLF) 组合。
返回一段可供嵌入的 JavaScript 代码,若在支持 JavaScript 的浏览器上运行,其作用如同发送 HTTP 头部信息一样。
attrs 的含义与
output()的相同。
若 rawdata 为字符串,则会作为
HTTP_COOKIE进行解析,并将找到的值添加为Morsel。 如果是字典值,则等价于:for k, v in rawdata.items(): cookie[k] = v
21.23.2. Morsel 对象¶
对键/值对的抽象,带有 RFC 2109 的部分属性。
morsel 对象类似于字典,键的组成是常量——均为有效的 RFC 2109 属性,包括:
expirespathcommentdomainmax-agesecureversionhttponly
httponly属性指明了该 cookie 仅在 HTTP 请求中传输,且不能通过 JavaScript 访问。这是为了减轻某些跨站脚本攻击的危害。键不区分大小写,默认值为
''。
Cookie的值。
3.5 版后已移除: assigning to
value; useset()instead.
编码后的 cookie 值——也即要发送的内容。
3.5 版后已移除: assigning to
coded_value; useset()instead.
cookie 名称
3.5 版后已移除: assigning to
key; useset()instead.
设置 key、value 和 coded_value 属性。
3.5 版后已移除: The undocumented LegalChars parameter is ignored and will be removed in a future version.
K 是否属于
Morsel的键。
返回 morsel 的字符串形式,适用于作为 HTTP 头部信息进行发送。默认包含所有属性,除非给出 attrs 属性列表。header 默认为
"Set-Cookie:"。
返回一段可供嵌入的 JavaScript 代码,若在支持 JavaScript 的浏览器上运行,其作用如同发送 HTTP 头部信息一样。
attrs 的含义与
output()的相同。
返回 morsel 的字符串形式,不含 HTTP 或 JavaScript 数据。
attrs 的含义与
output()的相同。
用字典 values 中的值更新 morsel 字典中的值。若有 values 字典中的键不是有效的 RFC 2109 属性,则会触发错误。
在 3.5 版更改: 无效键会触发错误。
返回 morsel 对象的浅表复制副本。
在 3.5 版更改: 返回一个 morsel 对象,而非字典。
若 key 不是有效的 RFC 2109 属性则触发错误,否则与
dict.setdefault()相同。
21.23.3. 示例¶
以下例子演示了 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
