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
BaseCookie
and 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 属性,包括:
expires
path
comment
domain
max-age
secure
version
httponly
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