http.cookiejarHTTP客户端的Cookie处理

源代码: Lib / http / cookiejar.py


http.cookiejar模块定义了自动处理HTTPcookies的类。它对于访问需要通过来自aweb服务器的HTTP响应在客户端计算机上设置的小型数据cookies的网站非常有用,然后在以后的HTTP请求中返回到服务器.

处理常规Netscape cookie协议和 RFC 2965 定义的协议。RFC 2965处理默认关闭.RFC 2109 cookies被解析为Netscape cookie,随后根据有效的“政策”进行Netscape或RFC 2965 cookie处理。注意互联网上绝大多数的cookie都是Netscape cookies。http.cookiejar试图遵循事实上的Netscape cookie协议(它与原来的Netscape规范中的规定大致相同),包括注意到max-ageport用RFC 2965引入的cookie-attributes

注意

Set-CookieSet-Cookie2标题中找到的各种命名参数(例如domainexpires)通常被称为attributes。为了区别于Python属性,该模块的文档使用术语cookie-attribute而不是

该模块定义了以下异常:

exception http.cookiejar.LoadError

FileCookieJar无法从文件loadcookies提出此异常。LoadErrorOSError.

改版3.3:LoadError成为OSError代替IOError.

提供以下类:

class http.cookiejar.CookieJarpolicy=None

policy是实现CookiePolicy interface.

的对象CookieJarclass存储HTTP cookie。它从HTTPrequests中提取cookie,并在HTTP响应中返回它们。CookieJar在必要时,instancesOso自动过期包含的cookie。子类也负责存储和检索文件或数据库中的cookie .

class http.cookiejar.FileCookieJar (filename, delayload=None, policy=None)

policy是实现CookiePolicy接口的对象。有关其他参数,请参阅相应属性的文档.

A CookieJar它可以从磁盘上的文件加载cookie,也可能将cookie保存到磁盘上。饼干是从命名文件加载到load()revert()方法被调用。该类的子类记录在 FileCookieJar子类中,并与Web浏览器合作.

class http.cookiejar.CookiePolicy

这个类负责决定是否应该从服务器接受/返回每个cookie。

class http.cookiejar.DefaultCookiePolicyblocked_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是一系列域名,我们从不接受cookie,也不返回cookie。allowed_domains 如果不 None,这是我们接受并返回cookie的唯一域的序列。对于所有其他参数,请参阅CookiePolicyDefaultCookiePolicy对象的文档.

DefaultCookiePolicy为Netscape和 RFC 2965 cookies实现标准的接受/拒绝规则。默认情况下, RFC 2109 cookies(即饼干接收在Set-Cookie具有版本cookie属性of1的头部根据RFC 2965规则处理。但是,如果RFC 2965处理关闭或rfc2109_as_netscapeTrue,则RFC 2109 cookie会被CookieJar实例到Netscape cookie,将version实例的Cookie属性设置为0.DefaultCookiePolicy也提供了一些参数来允许对策略进行细微调整.

class http.cookiejar.Cookie

这个类代表Netscape,RFC 2109 RFC 2965 饼干。预计http.cookiejar建造自己的Cookie实例。相反,如有必要,请致电make_cookies()CookieJarinstance.

也可以看看

模块urllib.request
用自动cookie处理打开URL
模块http.cookies
HTTP cookie类,主要用于服务器端代码。http.cookiejarhttp.cookies模块不依赖于彼此.
https://curl.haxx.se/rfc/cookie_spec.html
原始Netscape cookie协议的规范。虽然这仍然是主流协议,但是所有主要浏览器(和http.cookiejar)实现的“Netscape cookie协议”只有与cookie_spec.html.
RFC 2109 /////勾勒出的相似之处。/ – HTTP状态管理机制
RFC 2965 淘汰。使用 with version = 1 .Set-Cookie RFC 2965
– HTTP状态管理机制 Netscape协议修复了错误。使用
代替Set-Cookie2。没有广泛使用.Set-Cookiehttp://kristol.org/cookie/errata.html
未完成的勘误表
RFC 2965 RFC 2964 .

– 使用HTTP状态管理 CookieJar和FileCookieJar对象

对象支持

CookieJar迭代器协议迭代过度包含 objects.Cookie有以下方法:

CookieJar

标题Cookie如果政策允许(即request.

rfc2965 hide_cookie2CookieJar属性CookiePolicy实例分别是真假,Cookie2在适当的时候也添加标题.

request物体(通常是urllib.request..Request实例)必须支持get_full_url(), get_host(),get_type(), unverifiable(), has_header(),get_header(), header_items(), add_unredirected_header()origin_req_host属性的方法,如urllib.request.

所述。在版本3.3中更改:request对象需要origin_req_host属性。依赖于慷慨的方法get_origin_req_host()被删除了

CookieJar.extract_cookiesresponse, request)

在政策允许的情况下,从HTTP response提取饼干并存放在CookieJar.

CookieJar将在Set-Cookie中寻找允许的Set-Cookie2response参数和存储cookie适当(取决于CookiePolicy.set_ok()方法的批准).

response对象(通常是调用urllib.request.urlopen()的结果,或者类似的)应该支持info()方法,返回email.message.Messageinstance.

request物体(通常是urllib.request.Request实例)必须支持方法get_full_url(), get_host(),unverifiable(),和origin_req_host属性,由urllib.request。该请求用于设置cookie的属性以及检查cookie是否被允许的默认值.

改版3.3:request物体需要origin_req_host属性。对已经删除的方法的依赖get_origin_req_host()已被删除.

CookieJar.set_policy (policy)

设置CookiePolicy实例使用.

CookieJar.make_cookiesresponse, request

Cookieresponse宾语。

请参阅extract_cookies()对于responserequestarguments.

设一个Cookie如果政策说这样做是可以的.

设一个Cookie,不检查政策,看是否应该设置.

CookieJar.clear ( [domain [, path [, name]] ]

清除一些饼干.

如果不带参数调用,请清除所有cookie。如果给出一个参数,则只删除属于该domain的cookie。如果给出两个参数,属于指定的domain和URL path被删除。如果给出三个参数,那么删除指定的domain, pathname的cookie。

如果不存在匹配的cookie,则增加KeyError.

CookieJar.clear_session_cookies

丢弃所有会话cookie.

删除所有包含具有真正discard属性的cookie(通常是因为他们没有max-ageexpires cookie-attribute,或显式discard cookie-attribute)。对于交互式浏览器,会话结束通常对应于关闭浏览器窗口.

注意save()方法无论如何都不会保存会话cookie,除非你通过传递一个真正的ignore_discard argument.

FileCookieJar实现了以下附加方法:

FileCookieJar.savefilename=None, ignore_discard=False, ignore_expires=False

将cookie保存到文件中

这基类提升NotImplementedError。子类可能会使此方法未实现.

filename是保存cookie的文件名。如果没有指定filename,则使用self.filename(默认值是传递给构造函数的值,如果有的话);如果self.filenameNone,ValueError被抬起来

ignore_discard:保存甚至设置为丢弃的cookie。ignore_expires:已经过期的已保存的饼干

如果文件已经存在,则覆盖该文件,从而擦除它包含的所有cookie。以后可以使用load()revert() methods

FileCookieJar.load//(filename=None, ignore_discard=False, ignore_expires=False)

从文件中加载cookie

旧的cookie保留,除非被新加载的cookie覆盖.

命令与save().

一样,指定文件的格式必须是上课,或LoadError将被提出。另外,OSError可能会被提出,例如,如果文件不存在.

改版3.3:IOError曾经被提出,它现在是的别名OSError.

FileCookieJar.revertfilename=None, ignore_discard=False, ignore_expires=False

清除所有cookie并从保存的文件中重新加载cookie .

revert()可以提出与load()相同的例外。如果有失败,物体的状态将不会改变.

FileCookieJar实例具有以下公共属性:

FileCookieJar.filename

用于保留cookie的默认文件的文件名。该属性可以分配给.

FileCookieJar.delayload

如果为true,则从磁盘延迟加载cookie。不应将此属性分配给。这只是一个提示,因为这只会影响性能,而不会影响行为(除非磁盘上的cookie发生变化)。一个CookieJar对象可以标记它。标准库中包含的FileCookieJar类没有延迟加载cookies.

FileCookieJar子类和与Web浏览器的合作

提供以下CookieJar子类用于阅读和写作.

class http.cookiejar.MozillaCookieJar(filename, delayload=None, policy=None)

A FileCookieJar可以在Mozilla cookies.txt文件格式中加载和保存cookie到磁盘(这也是Lynx和Netscapebrowsers使用的).

注意

这会丢失有关 RFC 2965 cookies以及更新的ornon的信息-standard cookie-attributes如port.

警告

在保存之前备份你的cookie如果你的cookie丢失/腐败会不方便(有一些细微之处可能会导致文件的轻微变化加载/保存往返).

另请注意,Mozilla运行时保存的cookie会被Mozilla

class http.cookiejar.LWPCookieJar//(filename, delayload=None, policy=None

// FileCookieJar可以从与libwww-perl库的Set-Cookie3文件格式兼容的格式加载和保存cookie到磁盘。如果您想将cookie存储在人类可读的文件中,这很方便.

CookiePolicy对象

实现CookiePolicy接口的对象具有以下方法:

CookiePolicy.set_okcookie, request

返回布尔值,指示cookie是否应该是从服务器接受

cookieCookie实例。request是一个客观实现CookieJar.extract_cookies().

CookiePolicy.return_okcookie, request

返回布尔值,指示是否应将cookie返回给服务器.

cookieCookie实例。request是一个客观实现CookieJar.add_cookie_header().

CookiePolicy.domain_return_okdomain, request

如果cookie域名不能返回,则返回false,给出cookie domain.

这种方法是一种优化。它消除了检查特定域(可能涉及读取许多文件)的每个cookiewith的需要。从domain_return_ok()path_return_ok()将所有工作留给return_ok().

如果domain_return_ok()为cookie域返回true,则为//路径调用path_return_ok()。否则,path_return_ok()return_ok()永远不会被调用那个cookie域。如果path_return_ok()返回true,return_ok()Cookie对象本身进行全面检查。否则,return_ok()永远不会被称为那个cookie路径.

注意每个domain_return_ok()都要求cookie域名,而不仅仅是request域。例如,可以同时使用".example.com""www.example.com"如果请求域是"www.example.com"。//适用于path_return_ok().

request论证如return_ok().

CookiePolicy.path_return_okpath, request

如果cookie不能返回,则返回false,给出cookie路径.

请参阅domain_return_ok().

除了实现上述方法之外,CookiePolicyinterface还必须提供以下属性,指示应使用哪些协议以及如何使用。所有这些属性都可以分配给.

CookiePolicy.netscape

实现Netscape协议.

CookiePolicy.rfc2965

实施 RFC 2965 协议.

CookiePolicy.hide_cookie2

不要将Cookie2标题添加到请求中(此标题的存在表示我们理解的服务器 RFC 2965 cookies).

最有用的方法定义一个CookiePolicy类是通过从DefaultCookiePolicy继承并覆盖上面的部分或全部方法。CookiePolicy本身可以用作’空策略’来允许设置和接收任何和所有cookie(这不太可能有用).

DefaultCookiePolicy Objects

实现标准接受和退回cookies的规则.

RFC 2965 和Netscape cookies都有保障。RFC 2965处理默认关闭

提供自己策略的最简单方法是在添加自己的附加检查之前覆盖此类并调用已覆盖实现中的方法:

import http.cookiejarclass MyCookiePolicy(http.cookiejar.DefaultCookiePolicy):    def set_ok(self, cookie, request):        if not http.cookiejar.DefaultCookiePolicy.set_ok(self, cookie, request):            return False        if i_dont_want_to_store_this_cookie(cookie):            return False        return True

除了实现CookiePolicy接口所需的功能外,这个class允许您阻止并允许域设置和接收cookie。还有一些严格的开关,允许你稍微加强相当松散的Netscape协议规则(以阻止一些良性cookie为代价).

提供域黑名单和白名单(默认情况下都关闭)。只有不在黑名单中并且存在于白名单中的域(如果白名单处于活动状态)参与cookie设置和返回。使用blocked_domains构造函数参数,blocked_domains()set_blocked_domains()方法(以及allowed_domains的相应参数和方法)。如果您设置了白名单,可以将其设置为None.

块中的域或允许不以点开头的列表必须等于要匹配的cookie域。例如,"example.com"匹配"example.com"的黑体,但"www.example.com"没有。使用点进行dostart的域也会被更具体的域匹配。例如,"www.example.com""www.coyote.example.com"都匹配".example.com"(但"example.com"本身没有)。IP地址是一个例外,并且必须完全匹配。例如,如果blocked_domains包含"192.168.1.2"".168.1.2",则阻止192.168.1.2,但不阻止193.168.1.2。

DefaultCookiePolicy实现以下附加方法:

DefaultCookiePolicy.blocked_domains

返回被阻止域的序列(作为元组).

DefaultCookiePolicy.set_blocked_domainsblocked_domains

设置序列被阻止的域名

DefaultCookiePolicy.is_blockeddomain)

返回domain是否在黑名单上设置或接收cookie.

DefaultCookiePolicy.allowed_domains(

返回None,或允许的域名序列(作为元组).

DefaultCookiePolicy.set_allowed_domainsallowed_domains

设置允许域的顺序,或None.

DefaultCookiePolicy.is_not_alloweddomain

返回是否domain的实现不在白名单上设置或接收cookie .

DefaultCookiePolicy实例具有以下属性,这些属性都是从同名的构造函数参数初始化的,并且可以分配给.

DefaultCookiePolicy.rfc2109_as_netscape

如果是,请求CookieJar实例降级RFC 2109 饼干(即在中收到的饼干)Set-Cookie通过设置Cookie实例为0.默认值为None,当且仅当 RFC 2965 处理是关闭的。因此,默认情况下RFC 2109 cookie被降级.

一般严格切换:

DefaultCookiePolicy.strict_domain

不允许站点使用国家/地区代码顶级leveldomains设置双组件域,如.co.uk, .gov.uk, .co.nz.etc。这远非完美,并不能保证工作!

RFC 2965 协议严格性开关:

DefaultCookiePolicy.strict_rfc2965_unverifiable

关注 RFC 2965 关于无法核实的交易的规则(通常,无法核实的交易是由重定向或对另一个网站上托管的图像的请求产生的交易)。如果这是假的,那么饼干就是never基于可验证性阻止

Netscape协议严格性切换:

DefaultCookiePolicy.strict_ns_unverifiable

应用 RFC 2965 对无法验证的交易的规则,甚至Netscape cookies .

DefaultCookiePolicy.strict_ns_domain

标志表明对Netscapecookies的域匹配规则有多严格。请参阅下面的可接受值.

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无法为.bar.com,因为www.foo包含一个点).

DefaultCookiePolicy.DomainStrictNonDomain

未明确指定domaincookie-attribute只能返回到与设置cookie的域相等的域(例如spam.example.com将不会从example.com返回没有domain cookie的cookie-属性).

DefaultCookiePolicy.DomainRFC2965Match

设置cookie时,需要一个完整的 RFC 2965 domain-match.

以下属性是为了方便而提供的,并且是上述标志最有用的组合:

DefaultCookiePolicy.DomainLiberal

相当于0(即所有上述Netscape域严格标志关闭).

DefaultCookiePolicy.DomainStrict

相当于DomainStrictNoDots|DomainStrictNonDomain.

示例

第一个示例显示了http.cookiejar

import http.cookiejar, urllib.requestcj = http.cookiejar.CookieJar()opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))r = opener.open("http://example.com/")

示例说明如何使用Netscape,Mozilla或Lynxcookies打开URL(假定使用Unix / Netscape约定来定位cookie文件):

import os, http.cookiejar, urllib.requestcj = http.cookiejar.MozillaCookieJar()cj.load(os.path.join(os.path.expanduser("~"), ".netscape", "cookies.txt"))opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))r = opener.open("http://example.com/")

下一个例子说明了DefaultCookiePolicy的用法。打开 RFC 2965 cookies,在设置和返回网景cookie时对域名更严格,并阻止某些域名设置cookie或让它们回复:

import urllib.requestfrom http.cookiejar import CookieJar, DefaultCookiePolicypolicy = DefaultCookiePolicy(    rfc2965=True, strict_ns_domain=Policy.DomainStrict,    blocked_domains=["ads.net", ".ads.net"])cj = CookieJar(policy)opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))r = opener.open("http://example.com/")

评论被关闭。