Cookie

注意

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

扫码关注云+社区

领取腾讯云代金券