– HTTP客户端的Cookie处理 – Internet协议和支持(Python教程)(参考资料)
http.cookiejar
– HTTP客户端的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-age
和port
用RFC 2965引入的cookie-attributes
注意
在Set-Cookie和Set-Cookie2标题中找到的各种命名参数(例如domain
和expires
)通常被称为attributes。为了区别于Python属性,该模块的文档使用术语cookie-attribute而不是
该模块定义了以下异常:
-
FileCookieJar
无法从文件loadcookies提出此异常。LoadError
是OSError
.改版3.3:LoadError成为
OSError
代替IOError
.
提供以下类:
-
policy是实现
CookiePolicy
interface.的对象
CookieJar
class存储HTTP cookie。它从HTTPrequests中提取cookie,并在HTTP响应中返回它们。CookieJar
在必要时,instancesOso自动过期包含的cookie。子类也负责存储和检索文件或数据库中的cookie .
-
policy是实现
CookiePolicy
接口的对象。有关其他参数,请参阅相应属性的文档.A
CookieJar
它可以从磁盘上的文件加载cookie,也可能将cookie保存到磁盘上。饼干是不从命名文件加载到load()
或revert()
方法被调用。该类的子类记录在 FileCookieJar子类中,并与Web浏览器合作.
-
这个类负责决定是否应该从服务器接受/返回每个cookie。
-
构造函数参数只能作为关键字参数传递.blocked_domains是一系列域名,我们从不接受cookie,也不返回cookie。allowed_domains 如果不
None
,这是我们接受并返回cookie的唯一域的序列。对于所有其他参数,请参阅CookiePolicy
和DefaultCookiePolicy
对象的文档.DefaultCookiePolicy
为Netscape和 RFC 2965 cookies实现标准的接受/拒绝规则。默认情况下, RFC 2109 cookies(即饼干接收在Set-Cookie具有版本cookie属性of1的头部根据RFC 2965规则处理。但是,如果RFC 2965处理关闭或rfc2109_as_netscape
是True
,则RFC 2109 cookie会被CookieJar
实例到Netscape cookie,将version
实例的Cookie
属性设置为0.DefaultCookiePolicy
也提供了一些参数来允许对策略进行细微调整.
-
这个类代表Netscape,RFC 2109 和RFC 2965 饼干。预计
http.cookiejar
建造自己的Cookie
实例。相反,如有必要,请致电make_cookies()
在CookieJar
instance.
也可以看看
- 模块
urllib.request
- 用自动cookie处理打开URL
- 模块
http.cookies
- HTTP cookie类,主要用于服务器端代码。
http.cookiejar
和http.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_cookie2
的CookieJar
属性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()
被删除了
-
在政策允许的情况下,从HTTP response提取饼干并存放在
CookieJar
.CookieJar
将在Set-Cookie中寻找允许的Set-Cookie2和response参数和存储cookie适当(取决于CookiePolicy.set_ok()
方法的批准).response对象(通常是调用
urllib.request.urlopen()
的结果,或者类似的)应该支持info()
方法,返回email.message.Message
instance.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()
已被删除.
-
设置
CookiePolicy
实例使用.
-
Cookie
从response宾语。请参阅
extract_cookies()
对于response和requestarguments.
-
设一个
Cookie
如果政策说这样做是可以的.
-
设一个
Cookie
,不检查政策,看是否应该设置.
-
清除一些饼干.
如果不带参数调用,请清除所有cookie。如果给出一个参数,则只删除属于该domain的cookie。如果给出两个参数,属于指定的domain和URL path被删除。如果给出三个参数,那么删除指定的domain, path和name的cookie。
如果不存在匹配的cookie,则增加
KeyError
.
-
丢弃所有会话cookie.
删除所有包含具有真正
discard
属性的cookie(通常是因为他们没有max-age
或expires
cookie-attribute,或显式discard
cookie-attribute)。对于交互式浏览器,会话结束通常对应于关闭浏览器窗口.注意
save()
方法无论如何都不会保存会话cookie,除非你通过传递一个真正的ignore_discard argument.
FileCookieJar
实现了以下附加方法:
-
将cookie保存到文件中
这基类提升
NotImplementedError
。子类可能会使此方法未实现.filename是保存cookie的文件名。如果没有指定filename,则使用
self.filename
(默认值是传递给构造函数的值,如果有的话);如果self.filename
是None
,ValueError
被抬起来ignore_discard:保存甚至设置为丢弃的cookie。ignore_expires:已经过期的已保存的饼干
如果文件已经存在,则覆盖该文件,从而擦除它包含的所有cookie。以后可以使用
load()
或revert()
methods
-
从文件中加载cookie
旧的cookie保留,除非被新加载的cookie覆盖.
命令与
save()
.一样,指定文件的格式必须是上课,或
LoadError
将被提出。另外,OSError
可能会被提出,例如,如果文件不存在.改版3.3:
IOError
曾经被提出,它现在是的别名OSError
.
-
清除所有cookie并从保存的文件中重新加载cookie .
revert()
可以提出与load()
相同的例外。如果有失败,物体的状态将不会改变.
FileCookieJar
实例具有以下公共属性:
-
用于保留cookie的默认文件的文件名。该属性可以分配给.
-
如果为true,则从磁盘延迟加载cookie。不应将此属性分配给。这只是一个提示,因为这只会影响性能,而不会影响行为(除非磁盘上的cookie发生变化)。一个
CookieJar
对象可以标记它。标准库中包含的FileCookieJar
类没有延迟加载cookies.
FileCookieJar子类和与Web浏览器的合作
提供以下CookieJar
子类用于阅读和写作.
-
A
FileCookieJar
可以在Mozillacookies.txt
文件格式中加载和保存cookie到磁盘(这也是Lynx和Netscapebrowsers使用的).注意
这会丢失有关 RFC 2965 cookies以及更新的ornon的信息-standard cookie-attributes如
port
.警告
在保存之前备份你的cookie如果你的cookie丢失/腐败会不方便(有一些细微之处可能会导致文件的轻微变化加载/保存往返).
另请注意,Mozilla运行时保存的cookie会被Mozilla
-
//
FileCookieJar
可以从与libwww-perl库的Set-Cookie3
文件格式兼容的格式加载和保存cookie到磁盘。如果您想将cookie存储在人类可读的文件中,这很方便.
CookiePolicy对象
实现CookiePolicy
接口的对象具有以下方法:
-
返回布尔值,指示cookie是否应该是从服务器接受
cookie是
Cookie
实例。request是一个客观实现CookieJar.extract_cookies()
.
-
返回布尔值,指示是否应将cookie返回给服务器.
cookie是
Cookie
实例。request是一个客观实现CookieJar.add_cookie_header()
.
-
如果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()
.
-
如果cookie不能返回,则返回false,给出cookie路径.
请参阅
domain_return_ok()
.
除了实现上述方法之外,CookiePolicy
interface还必须提供以下属性,指示应使用哪些协议以及如何使用。所有这些属性都可以分配给.
-
实现Netscape协议.
-
实施 RFC 2965 协议.
-
不要将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
实现以下附加方法:
-
返回被阻止域的序列(作为元组).
-
设置序列被阻止的域名
-
返回domain是否在黑名单上设置或接收cookie.
-
返回
None
,或允许的域名序列(作为元组).
-
设置允许域的顺序,或
None
.
-
返回是否domain的实现不在白名单上设置或接收cookie .
DefaultCookiePolicy
实例具有以下属性,这些属性都是从同名的构造函数参数初始化的,并且可以分配给.
-
如果是,请求
CookieJar
实例降级RFC 2109 饼干(即在中收到的饼干)Set-Cookie通过设置Cookie
实例为0.默认值为None
,当且仅当 RFC 2965 处理是关闭的。因此,默认情况下RFC 2109 cookie被降级.
一般严格切换:
-
不允许站点使用国家/地区代码顶级leveldomains设置双组件域,如
.co.uk
,.gov.uk
,.co.nz
.etc。这远非完美,并不能保证工作!
RFC 2965 协议严格性开关:
-
关注 RFC 2965 关于无法核实的交易的规则(通常,无法核实的交易是由重定向或对另一个网站上托管的图像的请求产生的交易)。如果这是假的,那么饼干就是never基于可验证性阻止
Netscape协议严格性切换:
-
应用 RFC 2965 对无法验证的交易的规则,甚至Netscape cookies .
-
标志表明对Netscapecookies的域匹配规则有多严格。请参阅下面的可接受值.
-
忽略Set-Cookie中的cookie:名称以开头的标题
"$"
.
-
不允许设置路径不匹配请求URI的cookie .
strict_ns_domain
是一组标志。它的值是通过一起构造的(例如,DomainStrictNoDots|DomainStrictNonDomain
表示设置了标志).
-
设置cookie时,’主机前缀’不能包含点(例如
www.foo.bar.com
无法为.bar.com
,因为www.foo
包含一个点).
-
未明确指定
domain
cookie-attribute只能返回到与设置cookie的域相等的域(例如spam.example.com
将不会从example.com
返回没有domain
cookie的cookie-属性).
-
设置cookie时,需要一个完整的 RFC 2965 domain-match.
以下属性是为了方便而提供的,并且是上述标志最有用的组合:
-
相当于0(即所有上述Netscape域严格标志关闭).
-
相当于
DomainStrictNoDots|DomainStrictNonDomain
.
Cookie对象
Cookie
实例的Python属性大致对应于各种cookie标准中指定的标准cookie属性。对应性不是一对一的,因为存在复杂的默认值规则,因为max-age
和expires
cookie-attributes包含等效信息,因为 RFC 2109 cookies可能会被http.cookiejar
从版本1降级到0版(Netscape)cookies .
除了在CookiePolicy
方法中的rarecircumstances之外,不应该分配这些属性。该课程不强制内部一致性,所以如果你这样做,你应该知道你在做什么.
-
Integer或
None
。Netscape cookies有version
0 RFC 2965 和 RFC 2109 cookies有version
cookie- 但是,请注意http.cookiejar
可以将RFC 2109 cookie降级为Netscape cookie,其中version
为0.
-
Cookie name(一个字符串)。
-
Cookie值(字符串),或
None
.
-
表示端口或一组端口的字符串(例如’80’或’80,8080’)或
None
.
-
Cookie路径(一个字符串,例如
"/acme/rocket_launchers"
).
-
True
如果cookie只能通过安全连接返回.
-
从epoch开始,以秒为单位的过期日期,或
None
。另请参阅is_expired()
方法.
-
True
如果这是一个会话cookie .
-
来自服务器的字符串注释,解释了这个cookie的功能,或者
None
.
-
链接到服务器的注释的URL,解释了这个cookie的功能,或者
None
.
-
True
如果这个cookie是作为 RFC 2109 cookie接收的(即cookie中的cookie)一个 Set-Cookie标题,该标题中Versioncookie属性的值为1)。提供此属性是因为http.cookiejar
可能会将RFC 2109 cookie降级为Netscape cookie,在这种情况下version
是0.
-
True
如果服务器明确指定了一个端口或一组端口(在Set-Cookie / Set-Cookie2标题中).
-
True
如果服务器明确指定了域.
-
True
如果服务器明确指定的域以点开头("."
).
Cookies可能有其他非标准cookie属性。可以使用以下方法访问这些:
-
如果cookie具有命名cookie-attribute.
-
如果cookie具有指定的cookie属性,则返回true,返回其值。否则,返回default.
-
设置命名cookie-attribute.的值
Cookie
class还定义了以下方法:
-
True
如果cookie已经超过了服务器请求它的时间。如果给出now(自纪元以来的秒数),则返回指定时间的新手是否已过期.
示例
第一个示例显示了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/")
评论被关闭。