mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 15:04:05 +08:00
26 lines
82 KiB
HTML
26 lines
82 KiB
HTML
<div class="body" role="main"><div class="section" id="module-http.cookiejar"><h1><span class="yiyi-st" id="yiyi-10">21.24. <a class="reference internal" href="#module-http.cookiejar" title="http.cookiejar: Classes for automatic handling of HTTP cookies."><code class="xref py py-mod docutils literal"><span class="pre">http.cookiejar</span></code></a> - HTTP客户端的Cookie处理</span></h1><p><span class="yiyi-st" id="yiyi-11"><strong>源代码:</strong> <a class="reference external" href="https://hg.python.org/cpython/file/3.5/Lib/http/cookiejar.py">Lib / http / cookiejar.py</a></span></p><p><span class="yiyi-st" id="yiyi-12"><a class="reference internal" href="#module-http.cookiejar" title="http.cookiejar: Classes for automatic handling of HTTP cookies."><code class="xref py py-mod docutils literal"><span class="pre">http.cookiejar</span></code></a>模块定义了用于自动处理HTTP Cookie的类。</span><span class="yiyi-st" id="yiyi-13">它对于访问需要小块数据(<em class="dfn">cookie</em>)的网站非常有用,可通过来自Web服务器的HTTP响应在客户端计算机上设置,然后在以后的HTTP请求中返回到服务器。</span></p><p><span class="yiyi-st" id="yiyi-14">将处理常规Netscape cookie协议和由<span class="target" id="index-0"></span> <a class="rfc reference external" href="https://tools.ietf.org/html/rfc2965.html"><strong>RFC 2965</strong></a>定义的协议。</span><span class="yiyi-st" id="yiyi-15">默认情况下,RFC 2965处理被关闭。</span><span class="yiyi-st" id="yiyi-16"><span class="target" id="index-1"></span> <a class="rfc reference external" href="https://tools.ietf.org/html/rfc2109.html"><strong>RFC 2109</strong></a> Cookie将被解析为Netscape Cookie,随后根据“策略”生效,被视为Netscape或RFC 2965 Cookie。</span><span class="yiyi-st" id="yiyi-17">请注意,互联网上的绝大多数Cookie都是Netscape Cookie。</span><span class="yiyi-st" id="yiyi-18"><a class="reference internal" href="#module-http.cookiejar" title="http.cookiejar: Classes for automatic handling of HTTP cookies."><code class="xref py py-mod docutils literal"><span class="pre">http.cookiejar</span></code></a>尝试遵循事实上的Netscape Cookie协议(与原始Netscape规范中的协议大不相同),包括注意<code class="docutils literal"><span class="pre">max-age</span></code>和使用RFC 2965引入的<code class="docutils literal"><span class="pre">port</span></code> cookie属性。</span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-19">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-20">在<em class="mailheader">Set-Cookie</em>和<em class="mailheader">Set-Cookie2</em>标头中找到的各种命名参数(例如。</span><span class="yiyi-st" id="yiyi-21"><code class="docutils literal"><span class="pre">domain</span></code>和<code class="docutils literal"><span class="pre">expires</span></code>)通常被称为<em class="dfn">属性</em>。</span><span class="yiyi-st" id="yiyi-22">为了将它们与Python属性区分开来,本模块的文档使用术语<em class="dfn">cookie-attribute</em>。</span></p></div><p><span class="yiyi-st" id="yiyi-23">模块定义了以下异常:</span></p><dl class="exception"><dt id="http.cookiejar.LoadError"><span class="yiyi-st" id="yiyi-24"> <em class="property">exception </em><code class="descclassname">http.cookiejar.</code><code class="descname">LoadError</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-25"><a class="reference internal" href="#http.cookiejar.FileCookieJar" title="http.cookiejar.FileCookieJar"><code class="xref py py-class docutils literal"><span class="pre">FileCookieJar</span></code></a>的实例在从文件加载Cookie失败时引发此异常。</span><span class="yiyi-st" id="yiyi-26"><a class="reference internal" href="#http.cookiejar.LoadError" title="http.cookiejar.LoadError"><code class="xref py py-exc docutils literal"><span class="pre">LoadError</span></code></a>是<a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal"><span class="pre">OSError</span></code></a>的子类。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-27"><span class="versionmodified">在版本3.3中已更改:</span> LoadError已成为<a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal"><span class="pre">OSError</span></code></a>的子类,而不是<a class="reference internal" href="exceptions.html#IOError" title="IOError"><code class="xref py py-exc docutils literal"><span class="pre">IOError</span></code></a>。</span></p></div></dd></dl><p><span class="yiyi-st" id="yiyi-28">提供以下类:</span></p><dl class="class"><dt id="http.cookiejar.CookieJar"><span class="yiyi-st" id="yiyi-29"> <em class="property">class </em><code class="descclassname">http.cookiejar.</code><code class="descname">CookieJar</code><span class="sig-paren">(</span><em>policy=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-30"><em>policy</em>是实现<a class="reference internal" href="#http.cookiejar.CookiePolicy" title="http.cookiejar.CookiePolicy"><code class="xref py py-class docutils literal"><span class="pre">CookiePolicy</span></code></a>接口的对象。</span></p><p><span class="yiyi-st" id="yiyi-31"><a class="reference internal" href="#http.cookiejar.CookieJar" title="http.cookiejar.CookieJar"><code class="xref py py-class docutils literal"><span class="pre">CookieJar</span></code></a>类存储HTTP Cookie。</span><span class="yiyi-st" id="yiyi-32">它从HTTP请求中提取Cookie,并在HTTP响应中返回。</span><span class="yiyi-st" id="yiyi-33"><a class="reference internal" href="#http.cookiejar.CookieJar" title="http.cookiejar.CookieJar"><code class="xref py py-class docutils literal"><span class="pre">CookieJar</span></code></a>实例会在必要时自动过期包含的Cookie。</span><span class="yiyi-st" id="yiyi-34">The CookieJar class stores HTTP cookies. It extracts cookies from HTTP requests, and returns them in HTTP responses. CookieJar instances automatically expire contained cookies when necessary. Subclasses are also responsible for storing and retrieving cookies from a file or database.</span></p></dd></dl><dl class="class"><dt id="http.cookiejar.FileCookieJar"><span class="yiyi-st" id="yiyi-35"> <em class="property">class </em><code class="descclassname">http.cookiejar.</code><code class="descname">FileCookieJar</code><span class="sig-paren">(</span><em>filename</em>, <em>delayload=None</em>, <em>policy=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-36"><em>policy</em>是实现<a class="reference internal" href="#http.cookiejar.CookiePolicy" title="http.cookiejar.CookiePolicy"><code class="xref py py-class docutils literal"><span class="pre">CookiePolicy</span></code></a>接口的对象。</span><span class="yiyi-st" id="yiyi-37">有关其他参数,请参阅相应属性的文档。</span></p><p><span class="yiyi-st" id="yiyi-38"><a class="reference internal" href="#http.cookiejar.CookieJar" title="http.cookiejar.CookieJar"><code class="xref py py-class docutils literal"><span class="pre">CookieJar</span></code></a>可以从磁盘上的文件加载Cookie,或者保存Cookie到文件。</span><span class="yiyi-st" id="yiyi-39">在<a class="reference internal" href="#http.cookiejar.FileCookieJar.load" title="http.cookiejar.FileCookieJar.load"><code class="xref py py-meth docutils literal"><span class="pre">load()</span></code></a>或<a class="reference internal" href="#http.cookiejar.FileCookieJar.revert" title="http.cookiejar.FileCookieJar.revert"><code class="xref py py-meth docutils literal"><span class="pre">revert()</span></code></a>方法被调用之前,从指定文件加载<strong>NOT</strong></span><span class="yiyi-st" id="yiyi-40">此类的子类在<a class="reference internal" href="#file-cookie-jar-classes"><span>FileCookieJar subclasses and co-operation with web browsers</span></a>部分中进行了说明。</span></p></dd></dl><dl class="class"><dt id="http.cookiejar.CookiePolicy"><span class="yiyi-st" id="yiyi-41"> <em class="property">class </em><code class="descclassname">http.cookiejar.</code><code class="descname">CookiePolicy</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-42">这个类负责决定每个cookie是否应该被接受/返回到服务器。</span></p></dd></dl><dl class="class"><dt id="http.cookiejar.DefaultCookiePolicy"><span class="yiyi-st" id="yiyi-43"> <em class="property">class </em><code class="descclassname">http.cookiejar.</code><code class="descname">DefaultCookiePolicy</code><span class="sig-paren">(</span><em>blocked_domains=None</em>, <em>allowed_domains=None</em>, <em>netscape=True</em>, <em>rfc2965=False</em>, <em>rfc2109_as_netscape=None</em>, <em>hide_cookie2=False</em>, <em>strict_domain=False</em>, <em>strict_rfc2965_unverifiable=True</em>, <em>strict_ns_unverifiable=False</em>, <em>strict_ns_domain=DefaultCookiePolicy.DomainLiberal</em>, <em>strict_ns_set_initial_dollar=False</em>, <em>strict_ns_set_path=False</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-44">构造函数参数只应作为关键字参数传递。</span><span class="yiyi-st" id="yiyi-45"><em>blocked_domains</em>是一系列域名,我们从不接受Cookie,也不会将Cookie传回。</span><span class="yiyi-st" id="yiyi-46"><em>allowed_domains</em>如果不是<a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal"><span class="pre">None</span></code></a>,这是我们接受并返回Cookie的唯一域的序列。</span><span class="yiyi-st" id="yiyi-47">对于所有其他参数,请参阅<a class="reference internal" href="#http.cookiejar.CookiePolicy" title="http.cookiejar.CookiePolicy"><code class="xref py py-class docutils literal"><span class="pre">CookiePolicy</span></code></a>和<a class="reference internal" href="#http.cookiejar.DefaultCookiePolicy" title="http.cookiejar.DefaultCookiePolicy"><code class="xref py py-class docutils literal"><span class="pre">DefaultCookiePolicy</span></code></a>对象的文档。</span></p><p><span class="yiyi-st" id="yiyi-48"><a class="reference internal" href="#http.cookiejar.DefaultCookiePolicy" title="http.cookiejar.DefaultCookiePolicy"><code class="xref py py-class docutils literal"><span class="pre">DefaultCookiePolicy</span></code></a>实现Netscape和RFC 2965 Cookie的标准接受/拒绝规则。</span><span class="yiyi-st" id="yiyi-49">默认情况下,RFC 2109 cookie(即。</span><span class="yiyi-st" id="yiyi-50">在具有版本cookie属性为1的<em class="mailheader">Set-Cookie</em>头中接收的Cookie)根据RFC 2965规则进行处理。</span><span class="yiyi-st" id="yiyi-51">但是,如果RFC 2965处理被关闭或<a class="reference internal" href="#http.cookiejar.DefaultCookiePolicy.rfc2109_as_netscape" title="http.cookiejar.DefaultCookiePolicy.rfc2109_as_netscape"><code class="xref py py-attr docutils literal"><span class="pre">rfc2109_as_netscape</span></code></a>是<code class="docutils literal"><span class="pre">True</span></code>,则RFC 2109 Cookie会被<a class="reference internal" href="#http.cookiejar.CookieJar" title="http.cookiejar.CookieJar"><code class="xref py py-class docutils literal"><span class="pre">CookieJar</span></code></a>实例降级为Netscape Cookie,通过将<a class="reference internal" href="#http.cookiejar.Cookie" title="http.cookiejar.Cookie"><code class="xref py py-class docutils literal"><span class="pre">Cookie</span></code></a>实例的<code class="xref py py-attr docutils literal"><span class="pre">version</span></code>属性设置为0。</span><span class="yiyi-st" id="yiyi-52"><a class="reference internal" href="#http.cookiejar.DefaultCookiePolicy" title="http.cookiejar.DefaultCookiePolicy"><code class="xref py py-class docutils literal"><span class="pre">DefaultCookiePolicy</span></code></a>还提供一些参数,以允许对策略进行一些微调。</span></p></dd></dl><dl class="class"><dt id="http.cookiejar.Cookie"><span class="yiyi-st" id="yiyi-53"> <em class="property">class </em><code class="descclassname">http.cookiejar.</code><code class="descname">Cookie</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-54">此类表示Netscape,RFC 2109和RFC 2965 cookie。</span><span class="yiyi-st" id="yiyi-55">不希望<a class="reference internal" href="#module-http.cookiejar" title="http.cookiejar: Classes for automatic handling of HTTP cookies."><code class="xref py py-mod docutils literal"><span class="pre">http.cookiejar</span></code></a>的用户构造自己的<a class="reference internal" href="#http.cookiejar.Cookie" title="http.cookiejar.Cookie"><code class="xref py py-class docutils literal"><span class="pre">Cookie</span></code></a>实例。</span><span class="yiyi-st" id="yiyi-56">相反,如果需要,请在<a class="reference internal" href="#http.cookiejar.CookieJar" title="http.cookiejar.CookieJar"><code class="xref py py-class docutils literal"><span class="pre">CookieJar</span></code></a>实例中调用<code class="xref py py-meth docutils literal"><span class="pre">make_cookies()</span></code>。</span></p></dd></dl><div class="admonition seealso"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-57">也可以看看</span></p><dl class="docutils"><dt><span class="yiyi-st" id="yiyi-58">模块<a class="reference internal" href="urllib.request.html#module-urllib.request" title="urllib.request: Extensible library for opening URLs."><code class="xref py py-mod docutils literal"><span class="pre">urllib.request</span></code></a></span></dt><dd><span class="yiyi-st" id="yiyi-59">使用自动Cookie处理的网址打开。</span></dd><dt><span class="yiyi-st" id="yiyi-60">模块<a class="reference internal" href="http.cookies.html#module-http.cookies" title="http.cookies: Support for HTTP state management (cookies)."><code class="xref py py-mod docutils literal"><span class="pre">http.cookies</span></code></a></span></dt><dd><span class="yiyi-st" id="yiyi-61">HTTP cookie类,主要用于服务器端代码。</span><span class="yiyi-st" id="yiyi-62"><a class="reference internal" href="#module-http.cookiejar" title="http.cookiejar: Classes for automatic handling of HTTP cookies."><code class="xref py py-mod docutils literal"><span class="pre">http.cookiejar</span></code></a>和<a class="reference internal" href="http.cookies.html#module-http.cookies" title="http.cookies: Support for HTTP state management (cookies)."><code class="xref py py-mod docutils literal"><span class="pre">http.cookies</span></code></a>模块不依赖于彼此。</span></dd><dt><span class="yiyi-st" id="yiyi-63"><a class="reference external" href="https://curl.haxx.se/rfc/cookie_spec.html"> https://curl.haxx.se/rfc/cookie_spec.html T0></a></span></dt><dd><span class="yiyi-st" id="yiyi-64">原始Netscape Cookie协议的规范。</span><span class="yiyi-st" id="yiyi-65">尽管这仍然是主要的协议,但是所有主要浏览器(和<a class="reference internal" href="#module-http.cookiejar" title="http.cookiejar: Classes for automatic handling of HTTP cookies."><code class="xref py py-mod docutils literal"><span class="pre">http.cookiejar</span></code></a>)实现的“Netscape cookie协议”只是与在<code class="docutils literal"><span class="pre">cookie_spec.html</span></code>。</span></dd><dt><span class="yiyi-st" id="yiyi-66"><span class="target" id="index-2"></span> <a class="rfc reference external" href="https://tools.ietf.org/html/rfc2109.html"><strong>RFC 2109</strong></a> - HTTP状态管理机制</span></dt><dd><span class="yiyi-st" id="yiyi-67">由RFC 2965已过时。</span><span class="yiyi-st" id="yiyi-68">使用版本= 1的<em class="mailheader">Set-Cookie</em>。</span></dd><dt><span class="yiyi-st" id="yiyi-69"><span class="target" id="index-3"></span> <a class="rfc reference external" href="https://tools.ietf.org/html/rfc2965.html"><strong>RFC 2965</strong></a> - HTTP状态管理机制</span></dt><dd><span class="yiyi-st" id="yiyi-70">Netscape协议修复了错误。</span><span class="yiyi-st" id="yiyi-71">使用<em class="mailheader">Set-Cookie2</em>代替<em class="mailheader">Set-Cookie</em>。</span><span class="yiyi-st" id="yiyi-72">不广泛使用。</span></dd><dt><span class="yiyi-st" id="yiyi-73"><a class="reference external" href="http://kristol.org/cookie/errata.html"> http://kristol.org/cookie/errata.html T0></a></span></dt><dd><span class="yiyi-st" id="yiyi-74">RFC 2965的未完成勘误表。</span></dd></dl><p class="last"><span class="yiyi-st" id="yiyi-75"><span class="target" id="index-4"></span> <a class="rfc reference external" href="https://tools.ietf.org/html/rfc2964.html"><strong>RFC 2964</strong></a> - 使用HTTP状态管理</span></p></div><div class="section" id="cookiejar-and-filecookiejar-objects"><h2><span class="yiyi-st" id="yiyi-76">21.24.1. </span><span class="yiyi-st" id="yiyi-77">CookieJar和FileCookieJar对象</span></h2><p><span class="yiyi-st" id="yiyi-78"><a class="reference internal" href="#http.cookiejar.CookieJar" title="http.cookiejar.CookieJar"><code class="xref py py-class docutils literal"><span class="pre">CookieJar</span></code></a>对象支持<a class="reference internal" href="../glossary.html#term-iterator"><span class="xref std std-term">iterator</span></a>协议,用于对包含的<a class="reference internal" href="#http.cookiejar.Cookie" title="http.cookiejar.Cookie"><code class="xref py py-class docutils literal"><span class="pre">Cookie</span></code></a>对象进行迭代。</span></p><p><span class="yiyi-st" id="yiyi-79"><a class="reference internal" href="#http.cookiejar.CookieJar" title="http.cookiejar.CookieJar"><code class="xref py py-class docutils literal"><span class="pre">CookieJar</span></code></a>有以下方法:</span></p><dl class="method"><dt id="http.cookiejar.CookieJar.add_cookie_header"><span class="yiyi-st" id="yiyi-80"> <code class="descclassname">CookieJar.</code><code class="descname">add_cookie_header</code><span class="sig-paren">(</span><em>request</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-81">将<em class="mailheader">Cookie</em>标头添加到<em>请求</em>。</span></p><p><span class="yiyi-st" id="yiyi-82">如果政策允许(即。</span><span class="yiyi-st" id="yiyi-83"><a class="reference internal" href="#http.cookiejar.CookieJar" title="http.cookiejar.CookieJar"><code class="xref py py-class docutils literal"><span class="pre">CookieJar</span></code></a>的<a class="reference internal" href="#http.cookiejar.CookiePolicy" title="http.cookiejar.CookiePolicy"><code class="xref py py-class docutils literal"><span class="pre">CookiePolicy</span></code></a>实例的<code class="xref py py-attr docutils literal"><span class="pre">rfc2965</span></code>和<code class="xref py py-attr docutils literal"><span class="pre">hide_cookie2</span></code>属性分别为true和false),<em class="mailheader"> Cookie2</em>标题也会在适当时添加。</span></p><p><span class="yiyi-st" id="yiyi-84">The <em>request</em> object (usually a <code class="xref py py-class docutils literal"><span class="pre">urllib.request..Request</span></code> instance) must support the methods <code class="xref py py-meth docutils literal"><span class="pre">get_full_url()</span></code>, <code class="xref py py-meth docutils literal"><span class="pre">get_host()</span></code>, <code class="xref py py-meth docutils literal"><span class="pre">get_type()</span></code>, <code class="xref py py-meth docutils literal"><span class="pre">unverifiable()</span></code>, <code class="xref py py-meth docutils literal"><span class="pre">has_header()</span></code>, <code class="xref py py-meth docutils literal"><span class="pre">get_header()</span></code>, <code class="xref py py-meth docutils literal"><span class="pre">header_items()</span></code>, <code class="xref py py-meth docutils literal"><span class="pre">add_unredirected_header()</span></code> and <code class="xref py py-attr docutils literal"><span class="pre">origin_req_host</span></code> attribute as documented by <a class="reference internal" href="urllib.request.html#module-urllib.request" title="urllib.request: Extensible library for opening URLs."><code class="xref py py-mod docutils literal"><span class="pre">urllib.request</span></code></a>.</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-85"><span class="versionmodified">在版本3.3:</span> <em>请求</em>对象需要<code class="xref py py-attr docutils literal"><span class="pre">origin_req_host</span></code>属性中更改。</span><span class="yiyi-st" id="yiyi-86">依赖于已弃用的方法<code class="xref py py-meth docutils literal"><span class="pre">get_origin_req_host()</span></code>已被移除。</span></p></div></dd></dl><dl class="method"><dt id="http.cookiejar.CookieJar.extract_cookies"><span class="yiyi-st" id="yiyi-87"> <code class="descclassname">CookieJar.</code><code class="descname">extract_cookies</code><span class="sig-paren">(</span><em>response</em>, <em>request</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-88">从HTTP <em>响应</em>中提取Cookie,并将其存储在策略允许的<a class="reference internal" href="#http.cookiejar.CookieJar" title="http.cookiejar.CookieJar"><code class="xref py py-class docutils literal"><span class="pre">CookieJar</span></code></a>中。</span></p><p><span class="yiyi-st" id="yiyi-89"><a class="reference internal" href="#http.cookiejar.CookieJar" title="http.cookiejar.CookieJar"><code class="xref py py-class docutils literal"><span class="pre">CookieJar</span></code></a>将在<em>响应</em>参数中查找允许的<em class="mailheader">Set-Cookie</em>和<em class="mailheader">Set-Cookie2</em> (根据<a class="reference internal" href="#http.cookiejar.CookiePolicy.set_ok" title="http.cookiejar.CookiePolicy.set_ok"><code class="xref py py-meth docutils literal"><span class="pre">CookiePolicy.set_ok()</span></code></a>方法的批准)。</span></p><p><span class="yiyi-st" id="yiyi-90"><em>响应</em>对象(通常调用<a class="reference internal" href="urllib.request.html#urllib.request.urlopen" title="urllib.request.urlopen"><code class="xref py py-meth docutils literal"><span class="pre">urllib.request.urlopen()</span></code></a>或类似的结果)应支持<code class="xref py py-meth docutils literal"><span class="pre">info()</span></code>方法,它返回<a class="reference internal" href="email.message.html#email.message.Message" title="email.message.Message"><code class="xref py py-class docutils literal"><span class="pre">email.message.Message</span></code></a>实例。</span></p><p><span class="yiyi-st" id="yiyi-91">The <em>request</em> object (usually a <a class="reference internal" href="urllib.request.html#urllib.request.Request" title="urllib.request.Request"><code class="xref py py-class docutils literal"><span class="pre">urllib.request.Request</span></code></a> instance) must support the methods <code class="xref py py-meth docutils literal"><span class="pre">get_full_url()</span></code>, <code class="xref py py-meth docutils literal"><span class="pre">get_host()</span></code>, <code class="xref py py-meth docutils literal"><span class="pre">unverifiable()</span></code>, and <code class="xref py py-attr docutils literal"><span class="pre">origin_req_host</span></code> attribute, as documented by <a class="reference internal" href="urllib.request.html#module-urllib.request" title="urllib.request: Extensible library for opening URLs."><code class="xref py py-mod docutils literal"><span class="pre">urllib.request</span></code></a>. </span><span class="yiyi-st" id="yiyi-92">请求用于设置cookie属性的默认值以及检查是否允许设置cookie。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-93"><span class="versionmodified">在版本3.3:</span> <em>请求</em>对象需要<code class="xref py py-attr docutils literal"><span class="pre">origin_req_host</span></code>属性中更改。</span><span class="yiyi-st" id="yiyi-94">依赖于已弃用的方法<code class="xref py py-meth docutils literal"><span class="pre">get_origin_req_host()</span></code>已被移除。</span></p></div></dd></dl><dl class="method"><dt id="http.cookiejar.CookieJar.set_policy"><span class="yiyi-st" id="yiyi-95"> <code class="descclassname">CookieJar.</code><code class="descname">set_policy</code><span class="sig-paren">(</span><em>policy</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-96">设置要使用的<a class="reference internal" href="#http.cookiejar.CookiePolicy" title="http.cookiejar.CookiePolicy"><code class="xref py py-class docutils literal"><span class="pre">CookiePolicy</span></code></a>实例。</span></p></dd></dl><dl class="method"><dt id="http.cookiejar.CookieJar.make_cookies"><span class="yiyi-st" id="yiyi-97"> <code class="descclassname">CookieJar.</code><code class="descname">make_cookies</code><span class="sig-paren">(</span><em>response</em>, <em>request</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-98">从<em>响应</em>对象提取的<a class="reference internal" href="#http.cookiejar.Cookie" title="http.cookiejar.Cookie"><code class="xref py py-class docutils literal"><span class="pre">Cookie</span></code></a>对象的返回序列。</span></p><p><span class="yiyi-st" id="yiyi-99">有关<em>响应</em>和<em>请求</em>参数所需的接口,请参阅<a class="reference internal" href="#http.cookiejar.CookieJar.extract_cookies" title="http.cookiejar.CookieJar.extract_cookies"><code class="xref py py-meth docutils literal"><span class="pre">extract_cookies()</span></code></a>的文档。</span></p></dd></dl><dl class="method"><dt id="http.cookiejar.CookieJar.set_cookie_if_ok"><span class="yiyi-st" id="yiyi-100"> <code class="descclassname">CookieJar.</code><code class="descname">set_cookie_if_ok</code><span class="sig-paren">(</span><em>cookie</em>, <em>request</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-101">如果政策声明可以这么做,请设置<a class="reference internal" href="#http.cookiejar.Cookie" title="http.cookiejar.Cookie"><code class="xref py py-class docutils literal"><span class="pre">Cookie</span></code></a>。</span></p></dd></dl><dl class="method"><dt id="http.cookiejar.CookieJar.set_cookie"><span class="yiyi-st" id="yiyi-102"> <code class="descclassname">CookieJar.</code><code class="descname">set_cookie</code><span class="sig-paren">(</span><em>cookie</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-103">设置<a class="reference internal" href="#http.cookiejar.Cookie" title="http.cookiejar.Cookie"><code class="xref py py-class docutils literal"><span class="pre">Cookie</span></code></a>,而不检查政策是否应该设置。</span></p></dd></dl><dl class="method"><dt id="http.cookiejar.CookieJar.clear"><span class="yiyi-st" id="yiyi-104"> <code class="descclassname">CookieJar.</code><code class="descname">clear</code><span class="sig-paren">(</span><span class="optional">[</span><em>domain</em><span class="optional">[</span>, <em>path</em><span class="optional">[</span>, <em>name</em><span class="optional">]</span><span class="optional">]</span><span class="optional">]</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-105">清除一些cookie。</span></p><p><span class="yiyi-st" id="yiyi-106">如果没有参数调用,请清除所有Cookie。</span><span class="yiyi-st" id="yiyi-107">如果给定单个参数,则只会删除属于<em>域</em>的Cookie。</span><span class="yiyi-st" id="yiyi-108">如果给定两个参数,将删除属于指定的<em>域</em>和URL <em>路径</em>的Cookie。</span><span class="yiyi-st" id="yiyi-109">如果给出三个参数,则会删除指定的<em>域</em>,<em>路径</em>和<em>名称</em>的Cookie。</span></p><p><span class="yiyi-st" id="yiyi-110">如果没有匹配的Cookie,则引发<a class="reference internal" href="exceptions.html#KeyError" title="KeyError"><code class="xref py py-exc docutils literal"><span class="pre">KeyError</span></code></a>。</span></p></dd></dl><dl class="method"><dt id="http.cookiejar.CookieJar.clear_session_cookies"><span class="yiyi-st" id="yiyi-111"> <code class="descclassname">CookieJar.</code><code class="descname">clear_session_cookies</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-112">舍弃所有会话Cookie。</span></p><p><span class="yiyi-st" id="yiyi-113">丢弃所有包含具有真实<code class="xref py py-attr docutils literal"><span class="pre">discard</span></code>属性的Cookie(通常是因为它们没有<code class="docutils literal"><span class="pre">max-age</span></code>或<code class="docutils literal"><span class="pre">expires</span></code> cookie属性, <code class="docutils literal"><span class="pre">discard</span></code> cookie-attribute)。</span><span class="yiyi-st" id="yiyi-114">对于交互式浏览器,会话的结束通常对应于关闭浏览器窗口。</span></p><p><span class="yiyi-st" id="yiyi-115">注意,除非你通过传递一个真实的<em>ignore_discard</em>参数,否则<code class="xref py py-meth docutils literal"><span class="pre">save()</span></code>方法不会保存会话cookie。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-116"><a class="reference internal" href="#http.cookiejar.FileCookieJar" title="http.cookiejar.FileCookieJar"><code class="xref py py-class docutils literal"><span class="pre">FileCookieJar</span></code></a>实现以下附加方法:</span></p><dl class="method"><dt id="http.cookiejar.FileCookieJar.save"><span class="yiyi-st" id="yiyi-117"> <code class="descclassname">FileCookieJar.</code><code class="descname">save</code><span class="sig-paren">(</span><em>filename=None</em>, <em>ignore_discard=False</em>, <em>ignore_expires=False</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-118">将Cookie保存到文件。</span></p><p><span class="yiyi-st" id="yiyi-119">此基类引发<a class="reference internal" href="exceptions.html#NotImplementedError" title="NotImplementedError"><code class="xref py py-exc docutils literal"><span class="pre">NotImplementedError</span></code></a>。</span><span class="yiyi-st" id="yiyi-120">子类可以保留此方法未实现。</span></p><p><span class="yiyi-st" id="yiyi-121"><em>filename</em>是要保存Cookie的文件的名称。</span><span class="yiyi-st" id="yiyi-122">如果未指定<em>filename</em>,则使用<code class="xref py py-attr docutils literal"><span class="pre">self.filename</span></code>(其默认值为传递给构造函数的值(如果有));如果<code class="xref py py-attr docutils literal"><span class="pre">self.filename</span></code>是<a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal"><span class="pre">None</span></code></a>,则会引发<a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal"><span class="pre">ValueError</span></code></a>。</span></p><p><span class="yiyi-st" id="yiyi-123"><em>ignore_discard</em>:保存即将设置为丢弃的Cookie。</span><span class="yiyi-st" id="yiyi-124"><em>ignore_expires</em>:保存已过期的Cookie</span></p><p><span class="yiyi-st" id="yiyi-125">如果文件已经存在,则会被覆盖,从而擦除其包含的所有Cookie。</span><span class="yiyi-st" id="yiyi-126">保存的Cookie可以稍后使用<a class="reference internal" href="#http.cookiejar.FileCookieJar.load" title="http.cookiejar.FileCookieJar.load"><code class="xref py py-meth docutils literal"><span class="pre">load()</span></code></a>或<a class="reference internal" href="#http.cookiejar.FileCookieJar.revert" title="http.cookiejar.FileCookieJar.revert"><code class="xref py py-meth docutils literal"><span class="pre">revert()</span></code></a>方法恢复。</span></p></dd></dl><dl class="method"><dt id="http.cookiejar.FileCookieJar.load"><span class="yiyi-st" id="yiyi-127"> <code class="descclassname">FileCookieJar.</code><code class="descname">load</code><span class="sig-paren">(</span><em>filename=None</em>, <em>ignore_discard=False</em>, <em>ignore_expires=False</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-128">从文件加载Cookie。</span></p><p><span class="yiyi-st" id="yiyi-129">保留旧cookie,除非被新加载的cookie覆盖。</span></p><p><span class="yiyi-st" id="yiyi-130">参数与<a class="reference internal" href="#http.cookiejar.FileCookieJar.save" title="http.cookiejar.FileCookieJar.save"><code class="xref py py-meth docutils literal"><span class="pre">save()</span></code></a>相同。</span></p><p><span class="yiyi-st" id="yiyi-131">命名文件必须采用该类可以理解的格式,否则将引发<a class="reference internal" href="#http.cookiejar.LoadError" title="http.cookiejar.LoadError"><code class="xref py py-exc docutils literal"><span class="pre">LoadError</span></code></a>。</span><span class="yiyi-st" id="yiyi-132">此外,可能会引发<a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal"><span class="pre">OSError</span></code></a>,例如,如果文件不存在。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-133"><span class="versionmodified">在版本3.3中更改:</span> <a class="reference internal" href="exceptions.html#IOError" title="IOError"><code class="xref py py-exc docutils literal"><span class="pre">IOError</span></code></a>用于引发,现在是<a class="reference internal" href="exceptions.html#OSError" title="OSError"><code class="xref py py-exc docutils literal"><span class="pre">OSError</span></code></a>的别名。</span></p></div></dd></dl><dl class="method"><dt id="http.cookiejar.FileCookieJar.revert"><span class="yiyi-st" id="yiyi-134"> <code class="descclassname">FileCookieJar.</code><code class="descname">revert</code><span class="sig-paren">(</span><em>filename=None</em>, <em>ignore_discard=False</em>, <em>ignore_expires=False</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-135">清除所有Cookie并从已保存的文件重新加载Cookie。</span></p><p><span class="yiyi-st" id="yiyi-136"><a class="reference internal" href="#http.cookiejar.FileCookieJar.revert" title="http.cookiejar.FileCookieJar.revert"><code class="xref py py-meth docutils literal"><span class="pre">revert()</span></code></a>可以引发与<a class="reference internal" href="#http.cookiejar.FileCookieJar.load" title="http.cookiejar.FileCookieJar.load"><code class="xref py py-meth docutils literal"><span class="pre">load()</span></code></a>相同的异常。</span><span class="yiyi-st" id="yiyi-137">如果出现故障,对象的状态将不会被更改。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-138"><a class="reference internal" href="#http.cookiejar.FileCookieJar" title="http.cookiejar.FileCookieJar"><code class="xref py py-class docutils literal"><span class="pre">FileCookieJar</span></code></a>实例具有以下公共属性:</span></p><dl class="attribute"><dt id="http.cookiejar.FileCookieJar.filename"><span class="yiyi-st" id="yiyi-139"> <code class="descclassname">FileCookieJar.</code><code class="descname">filename</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-140">保存Cookie的默认文件的文件名。</span><span class="yiyi-st" id="yiyi-141">此属性可以分配给。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.FileCookieJar.delayload"><span class="yiyi-st" id="yiyi-142"> <code class="descclassname">FileCookieJar.</code><code class="descname">delayload</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-143">如果为true,则从磁盘延迟加载Cookie。</span><span class="yiyi-st" id="yiyi-144">此属性不应分配给。</span><span class="yiyi-st" id="yiyi-145">这只是一个提示,因为这只会影响性能,而不是行为(除非磁盘上的cookie正在改变)。</span><span class="yiyi-st" id="yiyi-146"><a class="reference internal" href="#http.cookiejar.CookieJar" title="http.cookiejar.CookieJar"><code class="xref py py-class docutils literal"><span class="pre">CookieJar</span></code></a>对象可以忽略它。</span><span class="yiyi-st" id="yiyi-147">包含在标准库中的<a class="reference internal" href="#http.cookiejar.FileCookieJar" title="http.cookiejar.FileCookieJar"><code class="xref py py-class docutils literal"><span class="pre">FileCookieJar</span></code></a>类不会延迟加载Cookie。</span></p></dd></dl></div><div class="section" id="filecookiejar-subclasses-and-co-operation-with-web-browsers"><h2><span class="yiyi-st" id="yiyi-148">21.24.2. </span><span class="yiyi-st" id="yiyi-149">FileCookieJar子类和与web浏览器的合作</span></h2><p><span class="yiyi-st" id="yiyi-150">提供以下<a class="reference internal" href="#http.cookiejar.CookieJar" title="http.cookiejar.CookieJar"><code class="xref py py-class docutils literal"><span class="pre">CookieJar</span></code></a>子类用于读取和写入。</span></p><dl class="class"><dt id="http.cookiejar.MozillaCookieJar"><span class="yiyi-st" id="yiyi-151"> <em class="property">class </em><code class="descclassname">http.cookiejar.</code><code class="descname">MozillaCookieJar</code><span class="sig-paren">(</span><em>filename</em>, <em>delayload=None</em>, <em>policy=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-152">可以使用Mozilla <code class="docutils literal"><span class="pre">cookies.txt</span></code>文件格式(也由Lynx和Netscape浏览器使用)加载并将Cookie保存到磁盘的<a class="reference internal" href="#http.cookiejar.FileCookieJar" title="http.cookiejar.FileCookieJar"><code class="xref py py-class docutils literal"><span class="pre">FileCookieJar</span></code></a>。</span></p><div class="admonition note"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-153">注意</span></p><p class="last"><span class="yiyi-st" id="yiyi-154">这会丢失有关RFC 2965 cookie以及有关较新或非标准cookie属性(如<code class="docutils literal"><span class="pre">port</span></code>)的信息。</span></p></div><div class="admonition warning"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-155">警告</span></p><p class="last"><span class="yiyi-st" id="yiyi-156">如果您的Cookie具有丢失/损坏的不便,请在保存前备份您的Cookie,(有一些细微之处可能导致加载/保存往返程序中的文件略有更改)。</span></p></div><p><span class="yiyi-st" id="yiyi-157">还要注意,Mozilla运行时保存的Cookie会被Mozilla破坏。</span></p></dd></dl><dl class="class"><dt id="http.cookiejar.LWPCookieJar"><span class="yiyi-st" id="yiyi-158"> <em class="property">class </em><code class="descclassname">http.cookiejar.</code><code class="descname">LWPCookieJar</code><span class="sig-paren">(</span><em>filename</em>, <em>delayload=None</em>, <em>policy=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-159">可以以与libwww-perl库的<code class="docutils literal"><span class="pre">Set-Cookie3</span></code>文件格式兼容的格式加载并将Cookie保存到磁盘的<a class="reference internal" href="#http.cookiejar.FileCookieJar" title="http.cookiejar.FileCookieJar"><code class="xref py py-class docutils literal"><span class="pre">FileCookieJar</span></code></a></span><span class="yiyi-st" id="yiyi-160">如果要将cookie存储在人工可读的文件中,这很方便。</span></p></dd></dl></div><div class="section" id="cookiepolicy-objects"><h2><span class="yiyi-st" id="yiyi-161">21.24.3. </span><span class="yiyi-st" id="yiyi-162">CookiePolicy对象</span></h2><p><span class="yiyi-st" id="yiyi-163">实现<a class="reference internal" href="#http.cookiejar.CookiePolicy" title="http.cookiejar.CookiePolicy"><code class="xref py py-class docutils literal"><span class="pre">CookiePolicy</span></code></a>接口的对象有以下方法:</span></p><dl class="method"><dt id="http.cookiejar.CookiePolicy.set_ok"><span class="yiyi-st" id="yiyi-164"> <code class="descclassname">CookiePolicy.</code><code class="descname">set_ok</code><span class="sig-paren">(</span><em>cookie</em>, <em>request</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-165">返回布尔值,指示是否应从服务器接受cookie。</span></p><p><span class="yiyi-st" id="yiyi-166"><em>cookie t>是<a class="reference internal" href="#http.cookiejar.Cookie" title="http.cookiejar.Cookie"><code class="xref py py-class docutils literal"><span class="pre">Cookie</span></code></a>实例。</em></span><span class="yiyi-st" id="yiyi-167"><em>请求</em>是实现由<a class="reference internal" href="#http.cookiejar.CookieJar.extract_cookies" title="http.cookiejar.CookieJar.extract_cookies"><code class="xref py py-meth docutils literal"><span class="pre">CookieJar.extract_cookies()</span></code></a>文档定义的接口的对象。</span></p></dd></dl><dl class="method"><dt id="http.cookiejar.CookiePolicy.return_ok"><span class="yiyi-st" id="yiyi-168"> <code class="descclassname">CookiePolicy.</code><code class="descname">return_ok</code><span class="sig-paren">(</span><em>cookie</em>, <em>request</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-169">返回布尔值,指示是否应将cookie返回到服务器。</span></p><p><span class="yiyi-st" id="yiyi-170"><em>cookie t>是<a class="reference internal" href="#http.cookiejar.Cookie" title="http.cookiejar.Cookie"><code class="xref py py-class docutils literal"><span class="pre">Cookie</span></code></a>实例。</em></span><span class="yiyi-st" id="yiyi-171"><em>请求</em>是实现由<a class="reference internal" href="#http.cookiejar.CookieJar.add_cookie_header" title="http.cookiejar.CookieJar.add_cookie_header"><code class="xref py py-meth docutils literal"><span class="pre">CookieJar.add_cookie_header()</span></code></a>文档定义的接口的对象。</span></p></dd></dl><dl class="method"><dt id="http.cookiejar.CookiePolicy.domain_return_ok"><span class="yiyi-st" id="yiyi-172"> <code class="descclassname">CookiePolicy.</code><code class="descname">domain_return_ok</code><span class="sig-paren">(</span><em>domain</em>, <em>request</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-173">给定Cookie域时,返回false,如果不应返回Cookie。</span></p><p><span class="yiyi-st" id="yiyi-174">这个方法是一个优化。</span><span class="yiyi-st" id="yiyi-175">它不需要检查每个cookie的特定域(这可能涉及读取许多文件)。</span><span class="yiyi-st" id="yiyi-176">从<a class="reference internal" href="#http.cookiejar.CookiePolicy.domain_return_ok" title="http.cookiejar.CookiePolicy.domain_return_ok"><code class="xref py py-meth docutils literal"><span class="pre">domain_return_ok()</span></code></a>和<a class="reference internal" href="#http.cookiejar.CookiePolicy.path_return_ok" title="http.cookiejar.CookiePolicy.path_return_ok"><code class="xref py py-meth docutils literal"><span class="pre">path_return_ok()</span></code></a>返回true将所有工作留给<a class="reference internal" href="#http.cookiejar.CookiePolicy.return_ok" title="http.cookiejar.CookiePolicy.return_ok"><code class="xref py py-meth docutils literal"><span class="pre">return_ok()</span></code></a>。</span></p><p><span class="yiyi-st" id="yiyi-177">如果<a class="reference internal" href="#http.cookiejar.CookiePolicy.domain_return_ok" title="http.cookiejar.CookiePolicy.domain_return_ok"><code class="xref py py-meth docutils literal"><span class="pre">domain_return_ok()</span></code></a>对于cookie域返回true,则为cookie路径调用<a class="reference internal" href="#http.cookiejar.CookiePolicy.path_return_ok" title="http.cookiejar.CookiePolicy.path_return_ok"><code class="xref py py-meth docutils literal"><span class="pre">path_return_ok()</span></code></a>。</span><span class="yiyi-st" id="yiyi-178">否则,不会为该Cookie域调用<a class="reference internal" href="#http.cookiejar.CookiePolicy.path_return_ok" title="http.cookiejar.CookiePolicy.path_return_ok"><code class="xref py py-meth docutils literal"><span class="pre">path_return_ok()</span></code></a>和<a class="reference internal" href="#http.cookiejar.CookiePolicy.return_ok" title="http.cookiejar.CookiePolicy.return_ok"><code class="xref py py-meth docutils literal"><span class="pre">return_ok()</span></code></a>。</span><span class="yiyi-st" id="yiyi-179">如果<a class="reference internal" href="#http.cookiejar.CookiePolicy.path_return_ok" title="http.cookiejar.CookiePolicy.path_return_ok"><code class="xref py py-meth docutils literal"><span class="pre">path_return_ok()</span></code></a>返回true,则使用<a class="reference internal" href="#http.cookiejar.Cookie" title="http.cookiejar.Cookie"><code class="xref py py-class docutils literal"><span class="pre">Cookie</span></code></a>对象本身调用<a class="reference internal" href="#http.cookiejar.CookiePolicy.return_ok" title="http.cookiejar.CookiePolicy.return_ok"><code class="xref py py-meth docutils literal"><span class="pre">return_ok()</span></code></a></span><span class="yiyi-st" id="yiyi-180">否则,从不为该Cookie路径调用<a class="reference internal" href="#http.cookiejar.CookiePolicy.return_ok" title="http.cookiejar.CookiePolicy.return_ok"><code class="xref py py-meth docutils literal"><span class="pre">return_ok()</span></code></a>。</span></p><p><span class="yiyi-st" id="yiyi-181">请注意,每个<em>Cookie</em>域都会调用<a class="reference internal" href="#http.cookiejar.CookiePolicy.domain_return_ok" title="http.cookiejar.CookiePolicy.domain_return_ok"><code class="xref py py-meth docutils literal"><span class="pre">domain_return_ok()</span></code></a>,而不仅仅是<em>请求</em>域。</span><span class="yiyi-st" id="yiyi-182">For example, the function might be called with both <code class="docutils literal"><span class="pre">".example.com"</span></code> and <code class="docutils literal"><span class="pre">"www.example.com"</span></code> if the request domain is <code class="docutils literal"><span class="pre">"www.example.com"</span></code>. </span><span class="yiyi-st" id="yiyi-183">对于<a class="reference internal" href="#http.cookiejar.CookiePolicy.path_return_ok" title="http.cookiejar.CookiePolicy.path_return_ok"><code class="xref py py-meth docutils literal"><span class="pre">path_return_ok()</span></code></a>也是如此。</span></p><p><span class="yiyi-st" id="yiyi-184"><em>请求</em>参数与<a class="reference internal" href="#http.cookiejar.CookiePolicy.return_ok" title="http.cookiejar.CookiePolicy.return_ok"><code class="xref py py-meth docutils literal"><span class="pre">return_ok()</span></code></a>中的文档相同。</span></p></dd></dl><dl class="method"><dt id="http.cookiejar.CookiePolicy.path_return_ok"><span class="yiyi-st" id="yiyi-185"> <code class="descclassname">CookiePolicy.</code><code class="descname">path_return_ok</code><span class="sig-paren">(</span><em>path</em>, <em>request</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-186">如果cookie不应该返回,返回false,给定cookie路径。</span></p><p><span class="yiyi-st" id="yiyi-187">请参阅<a class="reference internal" href="#http.cookiejar.CookiePolicy.domain_return_ok" title="http.cookiejar.CookiePolicy.domain_return_ok"><code class="xref py py-meth docutils literal"><span class="pre">domain_return_ok()</span></code></a>的文档。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-188">除了实现上述方法之外,<a class="reference internal" href="#http.cookiejar.CookiePolicy" title="http.cookiejar.CookiePolicy"><code class="xref py py-class docutils literal"><span class="pre">CookiePolicy</span></code></a>接口的实现还必须提供以下属性,指示应使用哪些协议以及如何使用。</span><span class="yiyi-st" id="yiyi-189">所有这些属性可以分配给。</span></p><dl class="attribute"><dt id="http.cookiejar.CookiePolicy.netscape"><span class="yiyi-st" id="yiyi-190"> <code class="descclassname">CookiePolicy.</code><code class="descname">netscape</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-191">实现Netscape协议。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.CookiePolicy.rfc2965"><span class="yiyi-st" id="yiyi-192"> <code class="descclassname">CookiePolicy.</code><code class="descname">rfc2965</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-193">实现RFC 2965协议。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.CookiePolicy.hide_cookie2"><span class="yiyi-st" id="yiyi-194"> <code class="descclassname">CookiePolicy.</code><code class="descname">hide_cookie2</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-195">不要向请求添加<em class="mailheader">Cookie2</em>头(此头的存在表示服务器,我们了解RFC 2965 cookie)。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-196">定义<a class="reference internal" href="#http.cookiejar.CookiePolicy" title="http.cookiejar.CookiePolicy"><code class="xref py py-class docutils literal"><span class="pre">CookiePolicy</span></code></a>类的最有用的方法是通过从<a class="reference internal" href="#http.cookiejar.DefaultCookiePolicy" title="http.cookiejar.DefaultCookiePolicy"><code class="xref py py-class docutils literal"><span class="pre">DefaultCookiePolicy</span></code></a>子类化并覆盖上述部分或全部方法。</span><span class="yiyi-st" id="yiyi-197"><a class="reference internal" href="#http.cookiejar.CookiePolicy" title="http.cookiejar.CookiePolicy"><code class="xref py py-class docutils literal"><span class="pre">CookiePolicy</span></code></a>本身可以用作“空策略”,允许设置和接收任何和所有Cookie(这不太可能有用)。</span></p></div><div class="section" id="defaultcookiepolicy-objects"><h2><span class="yiyi-st" id="yiyi-198">21.24.4. </span><span class="yiyi-st" id="yiyi-199">DefaultCookiePolicy对象</span></h2><p><span class="yiyi-st" id="yiyi-200">实施接受和返回Cookie的标准规则。</span></p><p><span class="yiyi-st" id="yiyi-201">包括RFC 2965和Netscape cookie。</span><span class="yiyi-st" id="yiyi-202">默认情况下,RFC 2965处理被关闭。</span></p><p><span class="yiyi-st" id="yiyi-203">提供您自己的策略的最简单的方法是在添加您自己的附加检查之前覆盖此类并在重写的实现中调用其方法:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">http.cookiejar</span>
|
||
<span class="k">class</span> <span class="nc">MyCookiePolicy</span><span class="p">(</span><span class="n">http</span><span class="o">.</span><span class="n">cookiejar</span><span class="o">.</span><span class="n">DefaultCookiePolicy</span><span class="p">):</span>
|
||
<span class="k">def</span> <span class="nf">set_ok</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cookie</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
|
||
<span class="k">if</span> <span class="ow">not</span> <span class="n">http</span><span class="o">.</span><span class="n">cookiejar</span><span class="o">.</span><span class="n">DefaultCookiePolicy</span><span class="o">.</span><span class="n">set_ok</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cookie</span><span class="p">,</span> <span class="n">request</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="kc">False</span>
|
||
<span class="k">if</span> <span class="n">i_dont_want_to_store_this_cookie</span><span class="p">(</span><span class="n">cookie</span><span class="p">):</span>
|
||
<span class="k">return</span> <span class="kc">False</span>
|
||
<span class="k">return</span> <span class="kc">True</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-204">除了实现<a class="reference internal" href="#http.cookiejar.CookiePolicy" title="http.cookiejar.CookiePolicy"><code class="xref py py-class docutils literal"><span class="pre">CookiePolicy</span></code></a>接口所需的功能,此类允许您阻止和允许域设置和接收Cookie。</span><span class="yiyi-st" id="yiyi-205">还有一些严格的开关,允许你收紧相当松的Netscape协议规则一点点(以代价阻塞一些良性的cookie)。</span></p><p><span class="yiyi-st" id="yiyi-206">提供域黑名单和白名单(默认都关闭)。</span><span class="yiyi-st" id="yiyi-207">只有不在黑名单中且位于白名单中(如果白名单处于活动状态)的域才会参与Cookie设置并返回。</span><span class="yiyi-st" id="yiyi-208">使用<em>blocked_domains</em>构造函数参数和<code class="xref py py-meth docutils literal"><span class="pre">blocked_domains()</span></code>和<code class="xref py py-meth docutils literal"><span class="pre">set_blocked_domains()</span></code>方法(以及<em>allowed_domains )。</em></span><span class="yiyi-st" id="yiyi-209">如果您设置了白名单,可以将其设置为<a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal"><span class="pre">None</span></code></a>,再次将其关闭。</span></p><p><span class="yiyi-st" id="yiyi-210">块或允许列表中不以点开头的域必须等于要匹配的Cookie域。</span><span class="yiyi-st" id="yiyi-211">例如,<code class="docutils literal"><span class="pre">"example.com"</span></code>匹配<code class="docutils literal"><span class="pre">"example.com"</span></code>的黑名单条目,但<code class="docutils literal"><span class="pre">"www.example.com"</span></code>不匹配。</span><span class="yiyi-st" id="yiyi-212">以点开始的域也由更具体的域匹配。</span><span class="yiyi-st" id="yiyi-213">例如,<code class="docutils literal"><span class="pre">"www.example.com"</span></code>和<code class="docutils literal"><span class="pre">"www.coyote.example.com"</span></code>匹配<code class="docutils literal"><span class="pre">".example.com"</span></code>但<code class="docutils literal"><span class="pre">"example.com"</span></code>本身不)。</span><span class="yiyi-st" id="yiyi-214">IP地址是一个例外,必须完全匹配。</span><span class="yiyi-st" id="yiyi-215">例如,如果blocked_domains包含<code class="docutils literal"><span class="pre">"192.168.1.2"</span></code>和<code class="docutils literal"><span class="pre">".168.1.2"</span></code>,则192.168.1.2被阻止,但193.168.1.2不被阻止。</span></p><p><span class="yiyi-st" id="yiyi-216"><a class="reference internal" href="#http.cookiejar.DefaultCookiePolicy" title="http.cookiejar.DefaultCookiePolicy"><code class="xref py py-class docutils literal"><span class="pre">DefaultCookiePolicy</span></code></a>实现以下附加方法:</span></p><dl class="method"><dt id="http.cookiejar.DefaultCookiePolicy.blocked_domains"><span class="yiyi-st" id="yiyi-217"> <code class="descclassname">DefaultCookiePolicy.</code><code class="descname">blocked_domains</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-218">返回被阻塞的域的序列(作为元组)。</span></p></dd></dl><dl class="method"><dt id="http.cookiejar.DefaultCookiePolicy.set_blocked_domains"><span class="yiyi-st" id="yiyi-219"> <code class="descclassname">DefaultCookiePolicy.</code><code class="descname">set_blocked_domains</code><span class="sig-paren">(</span><em>blocked_domains</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-220">设置阻塞域的顺序。</span></p></dd></dl><dl class="method"><dt id="http.cookiejar.DefaultCookiePolicy.is_blocked"><span class="yiyi-st" id="yiyi-221"> <code class="descclassname">DefaultCookiePolicy.</code><code class="descname">is_blocked</code><span class="sig-paren">(</span><em>domain</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-222">返回<em>域</em>是否位于设置或接收Cookie的黑名单上。</span></p></dd></dl><dl class="method"><dt id="http.cookiejar.DefaultCookiePolicy.allowed_domains"><span class="yiyi-st" id="yiyi-223"> <code class="descclassname">DefaultCookiePolicy.</code><code class="descname">allowed_domains</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-224">返回<a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal"><span class="pre">None</span></code></a>或允许的域序列(作为元组)。</span></p></dd></dl><dl class="method"><dt id="http.cookiejar.DefaultCookiePolicy.set_allowed_domains"><span class="yiyi-st" id="yiyi-225"> <code class="descclassname">DefaultCookiePolicy.</code><code class="descname">set_allowed_domains</code><span class="sig-paren">(</span><em>allowed_domains</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-226">设置允许的域的顺序,或<a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal"><span class="pre">None</span></code></a>。</span></p></dd></dl><dl class="method"><dt id="http.cookiejar.DefaultCookiePolicy.is_not_allowed"><span class="yiyi-st" id="yiyi-227"> <code class="descclassname">DefaultCookiePolicy.</code><code class="descname">is_not_allowed</code><span class="sig-paren">(</span><em>domain</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-228">返回<em>域</em>是否不在白名单中,用于设置或接收Cookie。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-229"><a class="reference internal" href="#http.cookiejar.DefaultCookiePolicy" title="http.cookiejar.DefaultCookiePolicy"><code class="xref py py-class docutils literal"><span class="pre">DefaultCookiePolicy</span></code></a>实例具有以下属性,它们都从同名的构造函数参数初始化,并且可以全部分配给它们。</span></p><dl class="attribute"><dt id="http.cookiejar.DefaultCookiePolicy.rfc2109_as_netscape"><span class="yiyi-st" id="yiyi-230"> <code class="descclassname">DefaultCookiePolicy.</code><code class="descname">rfc2109_as_netscape</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-231">如果为true,则请求<a class="reference internal" href="#http.cookiejar.CookieJar" title="http.cookiejar.CookieJar"><code class="xref py py-class docutils literal"><span class="pre">CookieJar</span></code></a>实例降级RFC 2109 Cookie(即。</span><span class="yiyi-st" id="yiyi-232">通过将<a class="reference internal" href="#http.cookiejar.Cookie" title="http.cookiejar.Cookie"><code class="xref py py-class docutils literal"><span class="pre">Cookie</span></code></a>实例的版本属性设置为0,在Netscape Cookie中接收到Cookie(Cookie版本为<em class="mailheader">Set-Cookie</em></span><span class="yiyi-st" id="yiyi-233">默认值为<a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal"><span class="pre">None</span></code></a>,在这种情况下,RFC 2109 cookie会降级,当且仅当RFC 2965处理被关闭。</span><span class="yiyi-st" id="yiyi-234">因此,RFC 2109 cookie默认降级。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-235">一般严格开关:</span></p><dl class="attribute"><dt id="http.cookiejar.DefaultCookiePolicy.strict_domain"><span class="yiyi-st" id="yiyi-236"> <code class="descclassname">DefaultCookiePolicy.</code><code class="descname">strict_domain</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-237">不允许网站设置具有国家/地区代码顶级域(如<code class="docutils literal"><span class="pre">.co.uk</span></code>,<code class="docutils literal"><span class="pre">.gov.uk</span></code>,<code class="docutils literal"><span class="pre">.co.nz</span></code> .etc。</span><span class="yiyi-st" id="yiyi-238">这是远非完美,不能保证工作!</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-239">RFC 2965协议严格开关:</span></p><dl class="attribute"><dt id="http.cookiejar.DefaultCookiePolicy.strict_rfc2965_unverifiable"><span class="yiyi-st" id="yiyi-240"> <code class="descclassname">DefaultCookiePolicy.</code><code class="descname">strict_rfc2965_unverifiable</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-241">遵循关于不可验证事务的RFC 2965规则(通常,不可验证的事务是由重定向或对托管在另一个站点上的图像的请求引起的)。</span><span class="yiyi-st" id="yiyi-242">如果这是假的,基于可验证性,cookies <em>从不</em>被阻止</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-243">Netscape协议严格开关:</span></p><dl class="attribute"><dt id="http.cookiejar.DefaultCookiePolicy.strict_ns_unverifiable"><span class="yiyi-st" id="yiyi-244"> <code class="descclassname">DefaultCookiePolicy.</code><code class="descname">strict_ns_unverifiable</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-245">对不可验证的事务应用RFC 2965规则,甚至对Netscape cookie。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.DefaultCookiePolicy.strict_ns_domain"><span class="yiyi-st" id="yiyi-246"> <code class="descclassname">DefaultCookiePolicy.</code><code class="descname">strict_ns_domain</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-247">标记指示Netscape Cookie的域匹配规则的严格程度。</span><span class="yiyi-st" id="yiyi-248">请参阅下面的可接受值。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.DefaultCookiePolicy.strict_ns_set_initial_dollar"><span class="yiyi-st" id="yiyi-249"> <code class="descclassname">DefaultCookiePolicy.</code><code class="descname">strict_ns_set_initial_dollar</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-250">忽略Set-Cookie中的Cookie:名称以<code class="docutils literal"><span class="pre">'$'</span></code>开头的标题。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.DefaultCookiePolicy.strict_ns_set_path"><span class="yiyi-st" id="yiyi-251"> <code class="descclassname">DefaultCookiePolicy.</code><code class="descname">strict_ns_set_path</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-252">不允许设置其路径不与路径匹配请求URI的Cookie。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-253"><code class="xref py py-attr docutils literal"><span class="pre">strict_ns_domain</span></code>是一个容器的标志。</span><span class="yiyi-st" id="yiyi-254">它的值由一起构造(例如,<code class="docutils literal"><span class="pre">DomainStrictNoDots|DomainStrictNonDomain</span></code>意味着两个标志都被设置)。</span></p><dl class="attribute"><dt id="http.cookiejar.DefaultCookiePolicy.DomainStrictNoDots"><span class="yiyi-st" id="yiyi-255"> <code class="descclassname">DefaultCookiePolicy.</code><code class="descname">DomainStrictNoDots</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-256">设置Cookie时,“主机前缀”不能包含点(例如。</span><span class="yiyi-st" id="yiyi-257"><code class="docutils literal"><span class="pre">www.foo.bar.com</span></code>无法为<code class="docutils literal"><span class="pre">.bar.com</span></code>设置Cookie,因为<code class="docutils literal"><span class="pre">www.foo</span></code>包含一个点。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.DefaultCookiePolicy.DomainStrictNonDomain"><span class="yiyi-st" id="yiyi-258"> <code class="descclassname">DefaultCookiePolicy.</code><code class="descname">DomainStrictNonDomain</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-259">未明确指定<code class="docutils literal"><span class="pre">domain</span></code> cookie属性的Cookie只能返回到与设置Cookie的域相等的域(例如。</span><span class="yiyi-st" id="yiyi-260"><code class="docutils literal"><span class="pre">spam.example.com</span></code>不会从未包含<code class="docutils literal"><span class="pre">domain</span></code> cookie属性的<code class="docutils literal"><span class="pre">example.com</span></code>返回Cookie)。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.DefaultCookiePolicy.DomainRFC2965Match"><span class="yiyi-st" id="yiyi-261"> <code class="descclassname">DefaultCookiePolicy.</code><code class="descname">DomainRFC2965Match</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-262">设置Cookie时,需要完整的RFC 2965域匹配。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-263">为方便起见,提供了以下属性,它们是上述标志的最有用的组合:</span></p><dl class="attribute"><dt id="http.cookiejar.DefaultCookiePolicy.DomainLiberal"><span class="yiyi-st" id="yiyi-264"> <code class="descclassname">DefaultCookiePolicy.</code><code class="descname">DomainLiberal</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-265">等于0(即。</span><span class="yiyi-st" id="yiyi-266">所有上述Netscape域严格标志关闭)。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.DefaultCookiePolicy.DomainStrict"><span class="yiyi-st" id="yiyi-267"> <code class="descclassname">DefaultCookiePolicy.</code><code class="descname">DomainStrict</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-268">等效于<code class="docutils literal"><span class="pre">DomainStrictNoDots|DomainStrictNonDomain</span></code>。</span></p></dd></dl></div><div class="section" id="cookie-objects"><h2><span class="yiyi-st" id="yiyi-269">21.24.5. </span><span class="yiyi-st" id="yiyi-270">Cookie对象</span></h2><p><span class="yiyi-st" id="yiyi-271"><a class="reference internal" href="#http.cookiejar.Cookie" title="http.cookiejar.Cookie"><code class="xref py py-class docutils literal"><span class="pre">Cookie</span></code></a>实例具有大致对应于各种Cookie标准中指定的标准Cookie属性的Python属性。</span><span class="yiyi-st" id="yiyi-272">由于<code class="docutils literal"><span class="pre">max-age</span></code>和<code class="docutils literal"><span class="pre">expires</span></code> cookie属性包含等效信息,因为对应关系不是一对一的,因为分配默认值有复杂的规则,因为RFC 2109 Cookie可能会被<a class="reference internal" href="#module-http.cookiejar" title="http.cookiejar: Classes for automatic handling of HTTP cookies."><code class="xref py py-mod docutils literal"><span class="pre">http.cookiejar</span></code></a>从版本1降级到版本0(Netscape)Cookie。</span></p><p><span class="yiyi-st" id="yiyi-273">除非在<a class="reference internal" href="#http.cookiejar.CookiePolicy" title="http.cookiejar.CookiePolicy"><code class="xref py py-class docutils literal"><span class="pre">CookiePolicy</span></code></a>方法中的罕见情况,否则不必分配这些属性。</span><span class="yiyi-st" id="yiyi-274">该类不强制内部一致性,所以你应该知道你在做什么,如果你这样做。</span></p><dl class="attribute"><dt id="http.cookiejar.Cookie.version"><span class="yiyi-st" id="yiyi-275"> <code class="descclassname">Cookie.</code><code class="descname">version</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-276">整数或<a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal"><span class="pre">None</span></code></a>。</span><span class="yiyi-st" id="yiyi-277">Netscape Cookie有<a class="reference internal" href="#http.cookiejar.Cookie.version" title="http.cookiejar.Cookie.version"><code class="xref py py-attr docutils literal"><span class="pre">version</span></code></a> 0。</span><span class="yiyi-st" id="yiyi-278">RFC 2965和RFC 2109 Cookie的<code class="docutils literal"><span class="pre">version</span></code> cookie属性为1。</span><span class="yiyi-st" id="yiyi-279">但请注意,<a class="reference internal" href="#module-http.cookiejar" title="http.cookiejar: Classes for automatic handling of HTTP cookies."><code class="xref py py-mod docutils literal"><span class="pre">http.cookiejar</span></code></a>可能会将RFC 2109 Cookie降级为Netscape Cookie,在这种情况下<a class="reference internal" href="#http.cookiejar.Cookie.version" title="http.cookiejar.Cookie.version"><code class="xref py py-attr docutils literal"><span class="pre">version</span></code></a>为0。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.Cookie.name"><span class="yiyi-st" id="yiyi-280"> <code class="descclassname">Cookie.</code><code class="descname">name</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-281">Cookie名称(字符串)。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.Cookie.value"><span class="yiyi-st" id="yiyi-282"> <code class="descclassname">Cookie.</code><code class="descname">value</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-283">Cookie值(字符串),或<a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal"><span class="pre">None</span></code></a>。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.Cookie.port"><span class="yiyi-st" id="yiyi-284"> <code class="descclassname">Cookie.</code><code class="descname">port</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-285">表示端口或一组端口的字符串(例如,</span><span class="yiyi-st" id="yiyi-286">'80'或'80,8080')或<a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal"><span class="pre">None</span></code></a>。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.Cookie.path"><span class="yiyi-st" id="yiyi-287"> <code class="descclassname">Cookie.</code><code class="descname">path</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-288">Cookie路径(字符串,例如。</span><span class="yiyi-st" id="yiyi-289"><code class="docutils literal"><span class="pre">'/acme/rocket_launchers'</span></code>)。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.Cookie.secure"><span class="yiyi-st" id="yiyi-290"> <code class="descclassname">Cookie.</code><code class="descname">secure</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-291"><code class="docutils literal"><span class="pre">True</span></code>如果Cookie只应通过安全连接返回。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.Cookie.expires"><span class="yiyi-st" id="yiyi-292"> <code class="descclassname">Cookie.</code><code class="descname">expires</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-293">从纪元开始的整数到期日期(以秒为单位),或<a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal"><span class="pre">None</span></code></a>。</span><span class="yiyi-st" id="yiyi-294">另请参见<a class="reference internal" href="#http.cookiejar.Cookie.is_expired" title="http.cookiejar.Cookie.is_expired"><code class="xref py py-meth docutils literal"><span class="pre">is_expired()</span></code></a>方法。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.Cookie.discard"><span class="yiyi-st" id="yiyi-295"> <code class="descclassname">Cookie.</code><code class="descname">discard</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-296"><code class="docutils literal"><span class="pre">True</span></code>如果这是会话Cookie。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.Cookie.comment"><span class="yiyi-st" id="yiyi-297"> <code class="descclassname">Cookie.</code><code class="descname">comment</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-298">来自服务器的字符串注释解释此Cookie的功能,或<a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal"><span class="pre">None</span></code></a>。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.Cookie.comment_url"><span class="yiyi-st" id="yiyi-299"> <code class="descclassname">Cookie.</code><code class="descname">comment_url</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-300">URL链接到来自服务器的解释此Cookie功能的注释,或<a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal"><span class="pre">None</span></code></a>。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.Cookie.rfc2109"><span class="yiyi-st" id="yiyi-301"> <code class="descclassname">Cookie.</code><code class="descname">rfc2109</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-302"><code class="docutils literal"><span class="pre">True</span></code>如果此Cookie是作为RFC 2109 Cookie接收的(即。</span><span class="yiyi-st" id="yiyi-303">Cookie到达<em class="mailheader">Set-Cookie</em>头,并且该头中的版本cookie属性的值为1)。</span><span class="yiyi-st" id="yiyi-304">提供此属性是因为<a class="reference internal" href="#module-http.cookiejar" title="http.cookiejar: Classes for automatic handling of HTTP cookies."><code class="xref py py-mod docutils literal"><span class="pre">http.cookiejar</span></code></a>可能会将RFC 2109 Cookie降级为Netscape Cookie,在这种情况下<a class="reference internal" href="#http.cookiejar.Cookie.version" title="http.cookiejar.Cookie.version"><code class="xref py py-attr docutils literal"><span class="pre">version</span></code></a>为0。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.Cookie.port_specified"><span class="yiyi-st" id="yiyi-305"> <code class="descclassname">Cookie.</code><code class="descname">port_specified</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-306"><code class="docutils literal"><span class="pre">True</span></code>如果服务器(在<em class="mailheader">Set-Cookie</em> / <em class="mailheader">Set-Cookie2</em>头中)明确指定了一个端口或一组端口。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.Cookie.domain_specified"><span class="yiyi-st" id="yiyi-307"> <code class="descclassname">Cookie.</code><code class="descname">domain_specified</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-308"><code class="docutils literal"><span class="pre">True</span></code>如果服务器显式指定了域。</span></p></dd></dl><dl class="attribute"><dt id="http.cookiejar.Cookie.domain_initial_dot"><span class="yiyi-st" id="yiyi-309"> <code class="descclassname">Cookie.</code><code class="descname">domain_initial_dot</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-310"><code class="docutils literal"><span class="pre">True</span></code>如果服务器显式指定的域以点(<code class="docutils literal"><span class="pre">'.'</span></code>)开头。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-311">Cookie可能具有其他非标准Cookie属性。</span><span class="yiyi-st" id="yiyi-312">这些可以使用以下方法访问:</span></p><dl class="method"><dt id="http.cookiejar.Cookie.has_nonstandard_attr"><span class="yiyi-st" id="yiyi-313"> <code class="descclassname">Cookie.</code><code class="descname">has_nonstandard_attr</code><span class="sig-paren">(</span><em>name</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-314"></span></p></dd></dl><dl class="method"><dt id="http.cookiejar.Cookie.get_nonstandard_attr"><span class="yiyi-st" id="yiyi-315"> <code class="descclassname">Cookie.</code><code class="descname">get_nonstandard_attr</code><span class="sig-paren">(</span><em>name</em>, <em>default=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-316">如果cookie具有命名的cookie属性,则返回其值。</span><span class="yiyi-st" id="yiyi-317">否则,返回<em>默认值</em>。</span></p></dd></dl><dl class="method"><dt id="http.cookiejar.Cookie.set_nonstandard_attr"><span class="yiyi-st" id="yiyi-318"> <code class="descclassname">Cookie.</code><code class="descname">set_nonstandard_attr</code><span class="sig-paren">(</span><em>name</em>, <em>value</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-319">设置命名的cookie属性的值。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-320"><a class="reference internal" href="#http.cookiejar.Cookie" title="http.cookiejar.Cookie"><code class="xref py py-class docutils literal"><span class="pre">Cookie</span></code></a>类还定义了以下方法:</span></p><dl class="method"><dt id="http.cookiejar.Cookie.is_expired"><span class="yiyi-st" id="yiyi-321"> <code class="descclassname">Cookie.</code><code class="descname">is_expired</code><span class="sig-paren">(</span><em>now=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-322"><code class="docutils literal"><span class="pre">True</span></code>如果Cookie已经过了服务器请求的时间,则应该到期。</span><span class="yiyi-st" id="yiyi-323">如果给定<em>现在</em>(自纪元以来的秒数),则返回Cookie是否在指定时间到期。</span></p></dd></dl></div><div class="section" id="examples"><h2><span class="yiyi-st" id="yiyi-324">21.24.6. </span><span class="yiyi-st" id="yiyi-325">实例</span></h2><p><span class="yiyi-st" id="yiyi-326">第一个示例显示了<a class="reference internal" href="#module-http.cookiejar" title="http.cookiejar: Classes for automatic handling of HTTP cookies."><code class="xref py py-mod docutils literal"><span class="pre">http.cookiejar</span></code></a>的最常见用法:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">http.cookiejar</span><span class="o">,</span> <span class="nn">urllib.request</span>
|
||
<span class="n">cj</span> <span class="o">=</span> <span class="n">http</span><span class="o">.</span><span class="n">cookiejar</span><span class="o">.</span><span class="n">CookieJar</span><span class="p">()</span>
|
||
<span class="n">opener</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">build_opener</span><span class="p">(</span><span class="n">urllib</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">HTTPCookieProcessor</span><span class="p">(</span><span class="n">cj</span><span class="p">))</span>
|
||
<span class="n">r</span> <span class="o">=</span> <span class="n">opener</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s2">"http://example.com/"</span><span class="p">)</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-327">此示例说明如何使用Netscape,Mozilla或Lynx Cookie打开URL(假定对于Cookie文件的位置使用Unix / Netscape惯例):</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">http.cookiejar</span><span class="o">,</span> <span class="nn">urllib.request</span>
|
||
<span class="n">cj</span> <span class="o">=</span> <span class="n">http</span><span class="o">.</span><span class="n">cookiejar</span><span class="o">.</span><span class="n">MozillaCookieJar</span><span class="p">()</span>
|
||
<span class="n">cj</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s2">"~"</span><span class="p">),</span> <span class="s2">".netscape"</span><span class="p">,</span> <span class="s2">"cookies.txt"</span><span class="p">))</span>
|
||
<span class="n">opener</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">build_opener</span><span class="p">(</span><span class="n">urllib</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">HTTPCookieProcessor</span><span class="p">(</span><span class="n">cj</span><span class="p">))</span>
|
||
<span class="n">r</span> <span class="o">=</span> <span class="n">opener</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s2">"http://example.com/"</span><span class="p">)</span>
|
||
</code></pre><p><span class="yiyi-st" id="yiyi-328">下一个示例说明了如何使用<a class="reference internal" href="#http.cookiejar.DefaultCookiePolicy" title="http.cookiejar.DefaultCookiePolicy"><code class="xref py py-class docutils literal"><span class="pre">DefaultCookiePolicy</span></code></a>。</span><span class="yiyi-st" id="yiyi-329">启用RFC 2965 Cookie,设置和返回Netscape Cookie时更严格的域名,并阻止某些域设置Cookie或返回:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">urllib.request</span>
|
||
<span class="kn">from</span> <span class="nn">http.cookiejar</span> <span class="k">import</span> <span class="n">CookieJar</span><span class="p">,</span> <span class="n">DefaultCookiePolicy</span>
|
||
<span class="n">policy</span> <span class="o">=</span> <span class="n">DefaultCookiePolicy</span><span class="p">(</span>
|
||
<span class="n">rfc2965</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">strict_ns_domain</span><span class="o">=</span><span class="n">Policy</span><span class="o">.</span><span class="n">DomainStrict</span><span class="p">,</span>
|
||
<span class="n">blocked_domains</span><span class="o">=</span><span class="p">[</span><span class="s2">"ads.net"</span><span class="p">,</span> <span class="s2">".ads.net"</span><span class="p">])</span>
|
||
<span class="n">cj</span> <span class="o">=</span> <span class="n">CookieJar</span><span class="p">(</span><span class="n">policy</span><span class="p">)</span>
|
||
<span class="n">opener</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">build_opener</span><span class="p">(</span><span class="n">urllib</span><span class="o">.</span><span class="n">request</span><span class="o">.</span><span class="n">HTTPCookieProcessor</span><span class="p">(</span><span class="n">cj</span><span class="p">))</span>
|
||
<span class="n">r</span> <span class="o">=</span> <span class="n">opener</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s2">"http://example.com/"</span><span class="p">)</span>
|
||
</code></pre></div></div></div> |