Cookie

Cookie — HTTP state management

注意

Cookie模块已被重命名为http.cookiesPython 3. 当将源代码转换为Python 3时,2to3工具将自动适应导入。

源代码: Lib / Cookie.py

Cookie模块定义了用于抽象cookie(HTTP状态管理机制)概念的类。它支持简单的仅字符串的cookie,并提供了一个抽象,让任何可序列化的数据类型作为cookie值。

该模块以前严格应用了RFC 2109RFC 2068规范中描述的分析规则。自从发现MSIE 3.0x不遵循这些规范中概述的字符规则,并且当处理Cookie时,许多当前的浏览器和服务器也放宽了解析规则。因此,所使用的解析规则不太严格。

的字符集,string.ascii_lettersstring.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报头被发送到每一个Morseloutput()方法。sep用于将标头连接在一起,默认情况下是组合'\r\n'(CRLF)。

在版本2.5中更改:默认分隔符已更改'\n'为与cookie规范相匹配。

BaseCookie.js_output([attrs])

返回一个嵌入式JavaScript代码片段,如果在支持JavaScript的浏览器上运行,则会像HTTP头文件发送一样运行。

attrs的含义与英文中的相同output()

BaseCookie.load(rawdata)

如果rawdata是一个字符串,则将其解析为一个字符串HTTP_COOKIE并将其中的值添加为Morsels。如果是字典,则相当于:

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