cookielib
cookielib — Cookie handling for HTTP clients
注意
该cookielib
模块已被重命名为http.cookiejar
Python 3. 当将源代码转换为Python 3时,2to3工具将自动适应导入。
2.4版本中的新功能。
源代码:
Lib / cookielib.py
该cookielib
模块定义了用于自动处理HTTP Cookie的类。对于访问需要小型数据片断的网站(cookie
),它可以通过来自Web服务器的HTTP响应在客户端机器上设置,然后在稍后的HTTP请求中返回到服务器。
常规的Netscape cookie协议和RFC 2965
定义的协议都被处理。RFC 2965
处理默认关闭。根据实际的“策略”,RFC 2109
cookie被解析为Netscape cookies,随后被视为Netscape或RFC 2965
cookie。请注意,互联网上绝大多数的cookies都是Netscape cookies。cookielib
试图遵循的事实上的Netscape cookie协议(其从载于原始的Netscape规范基本上不同),包括采取注意到的max-age
和port
与RFC 2965
引入cookie的属性。
注意
在Set-Cookie
和Set-Cookie2
头文件(例如。domain
和expires
)中找到的各种命名参数通常称为属性
。为了区分它们与Python属性
,本模块的文档使用术语cookie-attribute
代替。
该模块定义了以下例外情况:
exception cookielib.LoadError
FileCookieJar
在未能从文件加载cookie 时引发此异常的实例。
注意
为了向后兼容Python 2.4(提出了一个IOError
),它LoadError
是一个子类IOError
。
提供以下课程:
class cookielib.CookieJar(policy=None)
策略
是实现CookiePolicy
接口的对象。
在CookieJar
类存储的HTTP cookies。它从HTTP请求中提取cookie,并在HTTP响应中返回它们。CookieJar
实例会在必要时自动过期包含cookie。子类还负责存储和检索文件或数据库中的Cookie。
class cookielib.FileCookieJar(filename, delayload=None, policy=None)
策略
是实现CookiePolicy
接口的对象。对于其他参数,请参阅相应属性的文档。
CookieJar
可以从磁盘上的文件加载Cookie,也可以将Cookie保存到磁盘上的文件。在调用or 方法之前,不会
从指定的文件加载Cookies 。该类的子类在FileCookieJar
子类和与Web浏览器的合作中进行了介绍。load()revert()
class cookielib.CookiePolicy
这个类负责决定每个cookie是否被接受/返回到服务器。
class cookielib.DefaultCookiePolicy(blocked_domains=None, allowed_domains=None, netscape=True, rfc2965=False, rfc2109_as_netscape=None, hide_cookie2=False, strict_domain=False, strict_rfc2965_unverifiable=True, strict_ns_unverifiable=False, strict_ns_domain=DefaultCookiePolicy.DomainLiberal, strict_ns_set_initial_dollar=False, strict_ns_set_path=False)
构造函数参数只能作为关键字参数传递。blocked_domains
是一系列域名,我们从不接受cookies,也不返回cookie。如果不是,则为allowed_domains
None
,这是我们接受和返回cookie的唯一域的序列。对于所有其他参数,请参阅文档CookiePolicy
和DefaultCookiePolicy
对象。
DefaultCookiePolicy
实现Netscape和RFC 2965 cookie的标准接受/拒绝规则。默认情况下,根据RFC 2965规则处理RFC 2109 cookie(即,在版本Cookie
属性为1 的Set-Cookie
头中接收的Cookie
)。但是,如果关闭RFC 2965处理或rfc2109_as_netscape
将True
RFC 2109 cookie由CookieJar
实例“降级” 为Netscape cookie,则通过将实例的version
属性设置Cookie
为0. DefaultCookiePolicy
还提供了一些参数以允许对策略进行一些微调。
class cookielib.Cookie
这个类代表Netscape,RFC 2109和RFC 2965 cookies。预计用户不会cookielib
构建自己的Cookie
实例。相反,如果必要的话,叫make_cookies()
上一个CookieJar
实例。
1. CookieJar和FileCookieJar对象
CookieJar
对象支持用于遍历包含对象的迭代器协议Cookie
。
CookieJar
有以下方法:
CookieJar.add_cookie_header(request)
添加正确的Cookie
标头以请求
。
如果策略允许(即在rfc2965
与hide_cookie2
所述属性CookieJar
的CookiePolicy
实例分别是真和假),则COOKIE2
头也被添加在适当的时候。
所述请求
对象(通常是一个urllib2.Request
实例)必须支持方法get_full_url()
,get_host()
,get_type()
,unverifiable()
,get_origin_req_host()
,has_header()
,get_header()
,header_items()
,和add_unredirected_header()
,由作为记录的urllib2
。
CookieJar.extract_cookies(response, request)
从HTTP 响应中
提取cookie 并将其存储在CookieJar
策略允许的地方。
该CookieJar
会寻找容许的Set-Cookie
和设置,COOKIE2
在头响应
参数,存储cookies适当(受CookiePolicy.set_ok()
方法的批准)。
该响应
对象(到一个呼叫的通常的结果urllib2.urlopen()
,或类似的)应支持的info()
方法,该方法用一个返回对象getallmatchingheaders()
的方法(通常是一个mimetools.Message
实例)。
所述请求
对象(通常是一个urllib2.Request
实例)必须支持方法get_full_url()
,get_host()
,unverifiable()
,和get_origin_req_host()
,由作为记录的urllib2
。该请求
用于设置cookie属性的默认值,并用于检查是否允许设置cookie。
CookieJar.set_policy(policy)
设置CookiePolicy
要使用的实例。
CookieJar.make_cookies(response, request)
Cookie
从响应
对象中提取对象的返回序列。
请参阅文档以extract_cookies()
获取响应
和请求
参数所需的接口。
CookieJar.set_cookie_if_ok(cookie, request)
设置一个Cookie
如果政策说可以这样做。
CookieJar.set_cookie(cookie)
设置一个Cookie
,不用检查政策,看看是否应该设置。
CookieJar.clear([domain[, path[, name]]])
清除一些cookies。
如果没有参数调用,请清除所有的cookie。如果只有一个参数,则只有属于该域的
cookie 才会被删除。如果给出两个参数,则删除属于指定域
和URL 路径的
Cookie 。如果有三个参数,那么具有指定域
,路径
和名称
的cookie将被删除。
KeyError
如果不存在匹配的cookie,则引发。
CookieJar.clear_session_cookies()
丢弃所有会话cookie。
放弃所有包含的具有真实discard
属性的cookie (通常是因为它们具有no max-age
或expires
cookie属性或明确的discard
cookie属性)。对于交互式浏览器,会话结束通常对应于关闭浏览器窗口。
请注意,该save()
方法无论如何不会保存会话cookie,除非您通过传递true_default_discard
参数来另外提问。
FileCookieJar
实现以下附加方法:
FileCookieJar.save(filename=None, ignore_discard=False, ignore_expires=False)
将Cookie保存到文件。
这个基类引发了NotImplementedError
。子类可能会使此方法未实现。
文件名
是保存cookie的文件的名称。如果没有指定filename
,self.filename
则使用(默认值是传递给构造函数的值,如果有的话); 如果self.filename
是None
,ValueError
被提出。
ignore_discard
:保存即使被设置为丢弃的Cookie。ignore_expires
:保存即使过期的cookies
如果文件已经存在,则该文件被覆盖,从而清除它包含的所有cookie。保存的cookie可以在以后使用load()
or revert()
方法恢复。
FileCookieJar.load(filename=None, ignore_discard=False, ignore_expires=False)
从文件加载cookie。
旧cookies保留,除非被新加载的饼干覆盖。
参数是至于save()
。
指定的文件必须采用该类LoadError
可以理解的格式,否则会被引发。另外,IOError
可能会提出,例如,如果该文件不存在。
注意
为了向后兼容Python 2.4(提出了一个IOError
),它LoadError
是一个子类IOError
。
FileCookieJar.revert(filename=None, ignore_discard=False, ignore_expires=False)
清除所有Cookie并从保存的文件重新加载Cookie。
revert()
可以提出同样的例外load()
。如果出现故障,对象的状态不会改变。
FileCookieJar
实例具有以下公共属性:
FileCookieJar.filename
在其中保留Cookie的默认文件的文件名。该属性可能被分配给。
FileCookieJar.delayload
如果为true,则从磁盘中缓慢加载cookie。不应将此属性分配给。这只是一个暗示,因为这只会影响性能,而不会影响行为(除非磁盘上的cookie正在改变)。一个CookieJar
对象可能会忽略它。FileCookieJar
标准库中包含的任何类都不会延迟加载cookie。
2. FileCookieJar子类和与Web浏览器的合作
CookieJar
提供以下子类用于阅读和写作。
class cookielib.MozillaCookieJar(filename, delayload=None, policy=None)
一个FileCookieJar
可以从Mozilla cookies.txt
文件格式(也被Lynx和Netscape浏览器使用)加载和保存cookie到磁盘的软件。
注意
Firefox网络浏览器的第3版不再以cookies.txt
文件格式写入cookie 。
注意
这会丢失有关RFC 2965 cookie的信息,以及有关更新或非标准cookie属性的信息,例如port
。
警告
如果您的Cookie存在丢失/损坏不便的情况(有一些细微之处可能会导致文件在加载/保存往返时发生轻微变化),请在保存之前备份您的Cookie。
另外请注意,Mozilla运行时保存的cookie会被Mozilla破坏。
class cookielib.LWPCookieJar(filename, delayload=None, policy=None)
A FileCookieJar
可以以与libwww-perl库的Set-Cookie3
文件格式兼容的格式加载和保存cookie到磁盘。如果您想将cookie存储在可读的文件中,这很方便。
3. CookiePolicy对象
实现CookiePolicy
接口的对象具有以下方法:
CookiePolicy.set_ok(cookie, request)
返回指示是否应该从服务器接受cookie的布尔值。
cookie
是一个cookielib.Cookie
实例。请求
是实现由文档定义的接口的对象CookieJar.extract_cookies()
。
CookiePolicy.return_ok(cookie, request)
返回指示cookie是否应返回给服务器的布尔值。
cookie
是一个cookielib.Cookie
实例。请求
是实现由文档定义的接口的对象CookieJar.add_cookie_header()
。
CookiePolicy.domain_return_ok(domain, request)
如果cookie不应该返回,则返回false。
这种方法是一种优化。它不需要检查每个具有特定域的cookie(这可能涉及读取许多文件)。从所有工作中回归真实domain_return_ok()
并path_return_ok()
离开return_ok()
。
如果domain_return_ok()
cookie域返回true,path_return_ok()
则调用cookie路径。否则,path_return_ok()
并且return_ok()
永远不会调用该Cookie
域。如果path_return_ok()
返回true,return_ok()
则与Cookie
对象本身一起调用以进行全面检查。否则,return_ok()
永远不会调用该cookie路径。
请注意,domain_return_ok()
每个Cookie
域都会调用它,而不仅仅是请求
域。例如,如果请求
域是".example.com"
,"www.example.com"
则可以使用两者调用该函数"www.example.com"
。同样如此path_return_ok()
。
所述请求
参数是如记录return_ok()
。
CookiePolicy.path_return_ok(path, request)
给定cookie路径,如果不应该返回cookie,则返回false。
请参阅文档domain_return_ok()
。
除了实现上述方法外,CookiePolicy
接口的实现还必须提供以下属性,指示应使用哪些协议以及如何使用。所有这些属性都可以分配给。
CookiePolicy.netscape
实施Netscape协议。
CookiePolicy.rfc2965
实施RFC 2965协议。
CookiePolicy.hide_cookie2
不要将Cookie2
头添加到请求中(该头的存在向服务器表明我们理解RFC 2965 Cookie)。
定义一个CookiePolicy
类最有用的方法是通过子类化DefaultCookiePolicy
并覆盖上面的一些或全部方法。CookiePolicy
本身可能被用作'空白策略'来允许设置和接收任何和所有的cookies(这不太可能有用)。
4. DefaultCookiePolicy对象
实现接受和返回cookie的标准规则。
覆盖了RFC 2965和Netscape cookies。RFC 2965处理默认关闭。
提供自己策略的最简单方法是在添加自己的附加检查之前,重写此类并在重写的实现中调用其方法:
import cookielib
class MyCookiePolicy(cookielib.DefaultCookiePolicy):
def set_ok(self, cookie, request):
if not cookielib.DefaultCookiePolicy.set_ok(self, cookie, request):
return False
if i_dont_want_to_store_this_cookie(cookie):
return False
return True
除了实现CookiePolicy
界面所需的功能之外,该类还允许您阻止和允许域设置和接收Cookie。还有一些严格的开关,可以让你稍微收紧一些松散的Netscape协议规则(以阻止一些良性cookie为代价)。
提供域黑名单和白名单(默认情况下都是关闭的)。只有不在黑名单中并且出现在白名单中的域(如果白名单处于活动状态)参与cookie设置并返回。使用blocked_domains
构造函数参数blocked_domains()
和set_blocked_domains()
方法(以及allowed_domains
的相应参数和方法)。如果您设置了白名单,则可以将其设置为关闭None
。
块中的域或允许不以点开头的列表必须等于要匹配的cookie域。例如,"example.com"
匹配黑名单条目"example.com"
,但"www.example.com"
不匹配。以点开头的域也与更具体的域匹配。例如,两者"www.example.com"
和"www.coyote.example.com"
匹配".example.com"
(但"example.com"
本身不)。IP地址是一个例外,并且必须完全匹配。例如,如果blocked_domains包含"192.168.1.2"
and ".168.1.2"
,则192.168.1.2被阻塞,但193.168.1.2不是。
DefaultCookiePolicy
实现以下附加方法:
DefaultCookiePolicy.blocked_domains()
返回阻塞域的序列(作为元组)。
DefaultCookiePolicy.set_blocked_domains(blocked_domains)
设置阻止的域的顺序。
DefaultCookiePolicy.is_blocked(domain)
返回域名
是否在黑名单上,用于设置或接收Cookie。
DefaultCookiePolicy.allowed_domains()
返回None
或允许的域序列(作为元组)。
DefaultCookiePolicy.set_allowed_domains(allowed_domains)
设置允许的域的序列,或None
。
DefaultCookiePolicy.is_not_allowed(domain)
返回域名
是否不在白名单上,用于设置或接收cookie。
DefaultCookiePolicy
实例具有以下属性,这些属性都是从具有相同名称的构造函数参数中初始化的,并且可以全部分配给它们。
DefaultCookiePolicy.rfc2109_as_netscape
如果为true,则通过将CookieJar
实例的版本属性设置为0 ,请求实例将RFC 2109 cookie(即通过版本cookie属性为1 的Set-Cookie
头中收到的cookie)降级到Netscape cookie Cookie
。默认值为None
,在这种情况下,RFC 2109 cookie会被降级,当且仅当RFC 2965处理被关闭。因此,默认情况下RFC 2109 cookie会降级。
2.5版本中的新功能。
一般严格开关:
DefaultCookiePolicy.strict_domain
不要让站点设置两个组成结构域与像国家代码顶级域名.co.uk
,.gov.uk
,.co.nz
.etc。这远远不够完美,并不能保证工作!
RFC 2965协议严格性开关:
DefaultCookiePolicy.strict_rfc2965_unverifiable
按照关于无法验证的事务的RFC 2965规则(通常,不可验证的事务是由重定向或托管在另一个站点上的映像的请求导致的事务)。如果这是错误的,基于可验证性,cookies 不会
被阻塞
Netscape协议严格切换:
DefaultCookiePolicy.strict_ns_unverifiable
将RFC 2965规则应用于不可核实的交易,甚至应用于Netscape Cookie。
DefaultCookiePolicy.strict_ns_domain
标志表明对于Netscape cookie的域匹配规则有多严格。请参阅下面的可接受值。
DefaultCookiePolicy.strict_ns_set_initial_dollar
忽略Set-Cookie中的Cookie:名称以名称开头的标头'$'
。
DefaultCookiePolicy.strict_ns_set_path
不允许设置路径不匹配请求URI的Cookie。
strict_ns_domain
是旗帜的集合。它的值由或者一起构造(例如,DomainStrictNoDots|DomainStrictNonDomain
意味着两个标志都被设置)。
DefaultCookiePolicy.DomainStrictNoDots
在设置cookie时,'主机前缀'不能包含一个点(例如,由于包含一个点而www.foo.bar.com
不能设置cookie )。.bar.comwww.foo
DefaultCookiePolicy.DomainStrictNonDomain
没有明确指定domain
cookie属性的cookie只能返回到与设置cookie的域相同的域(例如,spam.example.com
不会返回example.com
没有domain
cookie属性的cookie)。
DefaultCookiePolicy.DomainRFC2965Match
设置cookie时,需要完整的RFC 2965域名匹配。
提供以下属性是为了方便起见,它们是上述标志最有用的组合:
DefaultCookiePolicy.DomainLiberal
相当于0(即所有上述Netscape域严格标志关闭)。
DefaultCookiePolicy.DomainStrict
相当于DomainStrictNoDots|DomainStrictNonDomain
。
5. Cookie对象
Cookie
实例的Python属性大致对应于各种Cookie
标准中指定的标准Cookie
属性。通信不是一一对应的,因为复杂的默认值分配规则很复杂,因为max-age
和expires
cookie属性包含等效信息,并且由于RFC 2109 cookie可能会cookielib
从版本1 “降级” 到版本0(Netscape)饼干。
对于这些属性的分配不应该是必要的,除非在极少数情况下CookiePolicy
。班级不强制内部一致性,所以如果你这样做,你应该知道你在做什么。
Cookie.version
整数或None
。Netscape cookies有version
0. RFC 2965和RFC 2109 cookie的version
cookie属性为1.但是,请注意,cookielib
可能会将RFC 2109 cookie降级为Netscape cookie,在这种情况下version
为0。
Cookie.name
Cookie名称(一个字符串)。
Cookie.value
Cookie值(字符串)或None
。
Cookie.port
代表一个端口或一组端口的字符串(例如'80'或'80,8080'),或者None
。
Cookie.path
Cookie路径(例如字符串'/acme/rocket_launchers'
)。
Cookie.secure
e
如果cookie
只能通过安全连接返回Tru。
Cookie.expires
自epoch开始,整数失效日期或以秒为单位None
。另见该is_expired()
方法。
Cookie.discard
返回True
如果这是一个会话cookie。
Cookie.comment
来自服务器的解释此cookie功能的字符串注释,或None
。
Cookie.comment_url
链接到来自服务器的解释此cookie功能的评论的URL,或None
。
Cookie.rfc2109
True
如果此cookie是作为RFC 2109 cookie收到的(即cookie到达Set-Cookie
标头,并且该标头中的Version cookie属性值为1)。提供此属性是因为cookielib
可能会将RFC 2109 cookie降级为Netscape cookie,在这种情况下version
为0。
2.5版本中的新功能。
Cookie.port_specified
True
如果一个端口或一组端口被服务器明确指定(在Set-Cookie
/ Set-Cookie2
头文件中)。
Cookie.domain_specified
返回True
如果域是由服务器明确指定的。
Cookie.domain_initial_dot
True
如果服务器明确指定的域以点('.'
)开头。
Cookie可能会有其他非标准Cookie属性。这些可以通过以下方法访问:
Cookie.has_nonstandard_attr(name)
如果cookie具有指定的cookie属性,则返回true。
Cookie.get_nonstandard_attr(name, default=None)
如果cookie具有指定的cookie属性,则返回其值。否则,返回默认值
。
Cookie.set_nonstandard_attr(name, value)
设置指定的cookie属性的值。
的Cookie
类也定义了下面的方法:
Cookie.is_expired([now=None])
True
如果cookie已超过服务器请求的时间,则应该过期。如果现在
给出(从纪元开始以秒计),返回cookie是否在指定时间到期。
6.例子
第一个例子显示了最常用的用法cookielib
:
import cookielib, urllib2
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")
这个例子说明了如何使用你的Netscape,Mozilla或者Lynx cookies(假定用于定位cookies文件的Unix / Netscape约定)来打开一个URL:
import os, cookielib, urllib2
cj = cookielib.MozillaCookieJar()
cj.load(os.path.join(os.path.expanduser("~"), ".netscape", "cookies.txt"))
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")
下一个例子说明了使用DefaultCookiePolicy
。打开RFC 2965 cookie,在设置和返回Netscape cookies时对域进行更严格的限制,并阻止某些域设置cookie或让它们返回:
import urllib2
from cookielib import CookieJar, DefaultCookiePolicy
policy = DefaultCookiePolicy(
rfc2965=True, strict_ns_domain=DefaultCookiePolicy.DomainStrict,
blocked_domains=["ads.net", ".ads.net"])
cj = CookieJar(policy)
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")