Cookie
Cookie — HTTP state management
注意
该Cookie
模块已被重命名为http.cookies
Python 3. 当将源代码转换为Python 3时,2to3工具将自动适应导入。
源代码:
Lib / Cookie.py
该Cookie
模块定义了用于抽象cookie(HTTP状态管理机制)概念的类。它支持简单的仅字符串的cookie,并提供了一个抽象,让任何可序列化的数据类型作为cookie值。
该模块以前严格应用了RFC 2109
和RFC 2068
规范中描述的分析规则。自从发现MSIE 3.0x不遵循这些规范中概述的字符规则,并且当处理Cookie时,许多当前的浏览器和服务器也放宽了解析规则。因此,所使用的解析规则不太严格。
的字符集,string.ascii_letters
,string.digits
和!#$%&'*+-.^_`|~
表示所述一组由该模块中的Cookie名称(如允许有效字符key
)。
注意
在遇到无效cookie时,CookieError
如果您的cookie数据来自浏览器,则应始终准备无效数据并CookieError
解析。
exception Cookie.CookieError
由于RFC 2109
无效,异常失败:不正确的属性,不正确的Set-Cookie
头等。
class Cookie.BaseCookie([input])
这个类是一个类似字典的对象,其键是字符串,其值是Morsel
实例。请注意,将某个键设置为某个值后,该值将首先转换为Morsel
包含键和值的值。
如果给出输入
,则将其传递给load()
方法。
class Cookie.SimpleCookie([input])
这个类派生自BaseCookie
和覆盖value_decode()
,value_encode()
并str()
分别是身份和身份。
class Cookie.SerialCookie([input])
这个类派生自BaseCookie
并覆盖value_decode()
value_encode() pickle.loads()
和pickle.dumps()
。
自2.3版弃用:从不受信任的cookie数据读取pickle值是一个巨大的安全漏洞,因为可以制作pickle字符串以在服务器上执行任意代码。它仅支持向后兼容性,并可能最终消失。
class Cookie.SmartCookie([input])
这个类来自于BaseCookie
。它覆盖value_decode()
是pickle.loads()
,如果它是一个有效的咸菜,否则本身的价值。它重写value_encode()
为pickle.dumps()
除非它是一个字符串,在这种情况下它会返回值本身。
自2.3版弃用:SerialCookie
此处适用的安全警告同样适用。
进一步的安全说明是必要的。为了向后兼容,Cookie
模块导出一个名为“ Cookie
只是别名”的类SmartCookie
。这可能是一个错误,将来可能会被删除。你不应该Cookie
在你的应用程序中使用这个类,因为你不应该使用这个SerialCookie
类。
1. Cookie对象
BaseCookie.value_decode(val)
从字符串表示中返回一个解码值。返回值可以是任何类型。这个方法没有做任何事BaseCookie
- 它存在,所以它可以被覆盖。
BaseCookie.value_encode(val)
返回一个编码值。val
可以是任何类型,但返回值必须是字符串。这个方法没有做任何事BaseCookie
- 它存在,所以它可以被覆盖。
一般来说,它应该是这样的情况,value_encode()
并且value_decode()
在value_decode
的范围上是相反的
。
BaseCookie.output([attrs[, header[, sep]]])
返回适合作为HTTP标头发送的字符串表示。ATTRS
和报头
被发送到每一个Morsel
的output()
方法。sep
用于将标头连接在一起,默认情况下是组合'\r\n'
(CRLF)。
在版本2.5中更改:默认分隔符已更改'\n'
为与cookie规范相匹配。
BaseCookie.js_output([attrs])
返回一个嵌入式JavaScript代码片段,如果在支持JavaScript的浏览器上运行,则会像HTTP头文件发送一样运行。
attrs
的含义与英文中的相同output()
。
BaseCookie.load(rawdata)
如果rawdata
是一个字符串,则将其解析为一个字符串HTTP_COOKIE
并将其中的值添加为Morsel
s。如果是字典,则相当于:
for k, v in rawdata.items():
cookie[k] = v
2. Morsel对象
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)
设置关键字
,值
和coded_value
属性。
Morsel.isReservedKey(K)
K
是否是a的一组键Morsel
。
Morsel.output([attrs[, header]])
返回Morsel的字符串表示形式,适合作为HTTP头发送。默认情况下,除非给出attrs
,否则包含所有属性,在这种情况下,它应该是要使用的属性列表。标题
是默认的"Set-Cookie:"
。
Morsel.js_output([attrs])
返回一个可嵌入的JavaScript代码片段,如果在支持JavaScript的浏览器上运行,就会像HTTP头文件发送一样。
attrs
的含义与英文中的相同output()
。
Morsel.OutputString([attrs])
返回表示Morsel的字符串,不包含任何周围的HTTP或JavaScript。
attrs
的含义与英文中的相同output()
。
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