“Python/docs/3.9/library/http.cookies”的版本间差异
来自菜鸟教程
Python/docs/3.9/library/http.cookies
(autoload) |
小 (Page commit) |
||
第1行: | 第1行: | ||
+ | {{DISPLAYTITLE:http.cookies — HTTP 状态管理 — Python 文档}} | ||
<div id="module-http.cookies" class="section"> | <div id="module-http.cookies" class="section"> | ||
<span id="http-cookies-http-state-management"></span> | <span id="http-cookies-http-state-management"></span> | ||
− | = | + | = http.cookies — HTTP 状态管理 = |
− | ''' | + | '''源代码:''' [[#id1|<span id="id2" class="problematic">:source:`Lib/http/cookies.py`</span>]] |
− | |||
− | |||
− | |||
− | |||
− | + | ----- | |
− | |||
− | |||
− | |||
− | |||
− | + | [[#module-http.cookies|http.cookies]] 模块定义了用于抽象 cookie 概念的类,cookie 是一种 HTTP 状态管理机制。 它支持简单的纯字符串 cookie,并提供了一个抽象,用于将任何可序列化的数据类型作为 cookie 值。 | |
− | <code>!#$%&'*+-.^_`|~:</code> | + | |
− | + | 该模块以前严格应用了 <span id="index-0" class="target"></span>[https://tools.ietf.org/html/rfc2109.html RFC 2109] 和 <span id="index-1" class="target"></span>[https://tools.ietf.org/html/rfc2068.html RFC 2068] 规范中描述的解析规则。 后来发现,MSIE 3.0x 不遵循这些规范中概述的字符规则,而且当今许多浏览器和服务器在处理 Cookie 时都放宽了解析规则。 因此,使用的解析规则不太严格。 | |
+ | |||
+ | 字符集 [[../string#string|string.ascii_letters]]、[[../string#string|string.digits]] 和 <code>!#$%&'*+-.^_`|~:</code> 表示该模块在 Cookie 名称中允许的有效字符集(如 key[ X171X])。 | ||
<div class="versionchanged"> | <div class="versionchanged"> | ||
− | <span class="versionmodified changed">在 3.3 | + | <span class="versionmodified changed">在 3.3 版中更改:</span>允许 ':' 作为有效的 Cookie 名称字符。 |
第29行: | 第24行: | ||
<div class="admonition note"> | <div class="admonition note"> | ||
− | + | 笔记 | |
− | + | 在遇到无效 cookie 时,会引发 [[#http.cookies.CookieError|CookieError]],因此如果您的 cookie 数据来自浏览器,您应该始终为无效数据做好准备并在解析时捕获 [[#http.cookies.CookieError|CookieError]]。 | |
− | cookie | ||
− | |||
</div> | </div> | ||
− | ; ''exception'' < | + | ; ''<span class="pre">exception</span>'' <span class="sig-prename descclassname"><span class="pre">http.cookies.</span></span><span class="sig-name descname"><span class="pre">CookieError</span></span> |
− | : | + | : 由于 <span id="index-2" class="target"></span>[https://tools.ietf.org/html/rfc2109.html RFC 2109] 无效,异常失败:不正确的属性、不正确的 ''Set-Cookie'' 标头等。 |
<dl> | <dl> | ||
− | <dt>''class'' < | + | <dt>''<span class="pre">class</span>'' <span class="sig-prename descclassname"><span class="pre">http.cookies.</span></span><span class="sig-name descname"><span class="pre">BaseCookie</span></span><span class="sig-paren">(</span><span class="optional">[</span>''<span class="pre">input</span>''<span class="optional">]</span><span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>这个类是一个类似字典的对象,其键是字符串,其值是 [[#http.cookies.Morsel|Morsel]] 实例。 请注意,将键设置为值后,该值首先转换为包含键和值的 [[#http.cookies.Morsel|Morsel]]。</p> |
− | + | <p>如果给出 ''input'',则将其传递给 [[#http.cookies.BaseCookie.load|load()]] 方法。</p></dd></dl> | |
− | |||
− | <p> | ||
− | ; ''class'' < | + | ; ''<span class="pre">class</span>'' <span class="sig-prename descclassname"><span class="pre">http.cookies.</span></span><span class="sig-name descname"><span class="pre">SimpleCookie</span></span><span class="sig-paren">(</span><span class="optional">[</span>''<span class="pre">input</span>''<span class="optional">]</span><span class="sig-paren">)</span> |
− | : | + | : 此类派生自 [[#http.cookies.BaseCookie|BaseCookie]] 并覆盖 <code>value_decode()</code> 和 <code>value_encode()</code>。 SimpleCookie 支持字符串作为 cookie 值。 在设置值时,SimpleCookie 调用内置的 [[../stdtypes#str|str()]] 将值转换为字符串。 从 HTTP 接收的值保留为字符串。 |
<div class="admonition seealso"> | <div class="admonition seealso"> | ||
− | + | 也可以看看 | |
− | ; | + | ; 模块 [[../http.cookiejar#module-http|http.cookiejar]] |
− | : | + | : Web ''客户端'' 的 HTTP cookie 处理。 [[../http.cookiejar#module-http|http.cookiejar]] 和 [[#module-http.cookies|http.cookies]] 模块不相互依赖。 |
− | ; <span id="index-3" class="target"></span>[https://tools.ietf.org/html/rfc2109.html | + | ; <span id="index-3" class="target"></span>[https://tools.ietf.org/html/rfc2109.html RFC 2109] - HTTP 状态管理机制 |
− | : | + | : 这是该模块实现的状态管理规范。 |
第63行: | 第54行: | ||
<div id="cookie-objects" class="section"> | <div id="cookie-objects" class="section"> | ||
− | <span id=" | + | <span id="id3"></span> |
− | == Cookie | + | == Cookie 对象 == |
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">BaseCookie.</span></span><span class="sig-name descname"><span class="pre">value_decode</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">val</span></span>''<span class="sig-paren">)</span> |
− | : | + | : 从字符串表示中返回一个元组 <code>(real_value, coded_value)</code>。 <code>real_value</code> 可以是任何类型。 这个方法在 [[#http.cookies.BaseCookie|BaseCookie]] 中没有解码——它存在所以它可以被覆盖。 |
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">BaseCookie.</span></span><span class="sig-name descname"><span class="pre">value_encode</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">val</span></span>''<span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>返回一个元组 <code>(real_value, coded_value)</code>。 ''val'' 可以是任何类型,但 <code>coded_value</code> 将始终转换为字符串。 这个方法在 [[#http.cookies.BaseCookie|BaseCookie]] 中没有编码——它存在所以它可以被覆盖。</p> |
− | <code>coded_value</code> | + | <p>一般来说,[[#http.cookies.BaseCookie.value_encode|value_encode()]]和[[#http.cookies.BaseCookie.value_decode|value_decode()]]应该是''value_decode''范围的倒数。</p></dd></dl> |
− | |||
− | |||
− | <p> | ||
− | [[#http.cookies.BaseCookie.value_decode| | ||
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">BaseCookie.</span></span><span class="sig-name descname"><span class="pre">output</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">attrs</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">header</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'Set-Cookie:'</span></span>'', ''<span class="n"><span class="pre">sep</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'\\r\\n'</span></span>''<span class="sig-paren">)</span> |
− | : | + | : 返回适合作为 HTTP 标头发送的字符串表示形式。 ''attrs'' 和 ''header'' 被发送到每个 [[#http.cookies.Morsel|Morsel]] 的 [[#http.cookies.BaseCookie.output|output()]] 方法。 ''sep'' 用于将标头连接在一起,默认情况下是组合 <code>'\r\n'</code> (CRLF)。 |
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">BaseCookie.</span></span><span class="sig-name descname"><span class="pre">js_output</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">attrs</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>''<span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>返回一个可嵌入的 JavaScript 片段,如果在支持 JavaScript 的浏览器上运行,它的行为将与发送 HTTP 标头一样。</p> |
− | + | <p>''attrs'' 的含义与 [[#http.cookies.BaseCookie.output|output()]] 中的含义相同。</p></dd></dl> | |
− | <p> | ||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">BaseCookie.</span></span><span class="sig-name descname"><span class="pre">load</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">rawdata</span></span>''<span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>如果 ''rawdata'' 是字符串,则将其解析为 <code>HTTP_COOKIE</code> 并将在那里找到的值添加为 [[#http.cookies.Morsel|Morsel]]s。 如果是字典,则相当于:</p> |
− | |||
<div class="highlight-python3 notranslate"> | <div class="highlight-python3 notranslate"> | ||
<div class="highlight"> | <div class="highlight"> | ||
− | < | + | <syntaxhighlight lang="python3">for k, v in rawdata.items(): |
− | cookie[k] = v</ | + | cookie[k] = v</syntaxhighlight> |
</div> | </div> | ||
第106行: | 第91行: | ||
<div id="morsel-objects" class="section"> | <div id="morsel-objects" class="section"> | ||
− | <span id=" | + | <span id="id4"></span> |
− | == | + | == 小物件 == |
<dl> | <dl> | ||
− | <dt>''class'' < | + | <dt>''<span class="pre">class</span>'' <span class="sig-prename descclassname"><span class="pre">http.cookies.</span></span><span class="sig-name descname"><span class="pre">Morsel</span></span></dt> |
− | <dd><p> | + | <dd><p>抽象一个键/值对,它有一些 <span id="index-4" class="target"></span>[https://tools.ietf.org/html/rfc2109.html RFC 2109] 属性。</p> |
− | <p>Morsels | + | <p>Morsels 是类似字典的对象,其键集是常量——有效的 <span id="index-5" class="target"></span>[https://tools.ietf.org/html/rfc2109.html RFC 2109] 属性,它们是</p> |
− | <span id="index-5" class="target"></span>[https://tools.ietf.org/html/rfc2109.html | ||
<ul> | <ul> | ||
<li><p><code>expires</code></p></li> | <li><p><code>expires</code></p></li> | ||
第125行: | 第109行: | ||
<li><p><code>samesite</code></p></li></ul> | <li><p><code>samesite</code></p></li></ul> | ||
− | <p> | + | <p>属性 <code>httponly</code> 指定 cookie 仅在 HTTP 请求中传输,不能通过 JavaScript 访问。 这旨在减轻某些形式的跨站点脚本。</p> |
− | + | <p>属性 <code>samesite</code> 指定浏览器不允许将 cookie 与跨站点请求一起发送。 这有助于减轻 CSRF 攻击。 此属性的有效值为“Strict”和“Lax”。</p> | |
− | + | <p>键不区分大小写,默认值为 <code>''</code>。</p> | |
− | <p> | ||
− | |||
− | |||
− | <p> | ||
<div class="versionchanged"> | <div class="versionchanged"> | ||
− | <p><span class="versionmodified changed">在 3.5 | + | <p><span class="versionmodified changed">在 3.5 版更改:</span><code>__eq__()</code> 现在考虑 [[#http.cookies.Morsel.key|key]] 和 [[#http.cookies.Morsel.value|value]]。</p> |
− | |||
</div> | </div> | ||
<div class="versionchanged"> | <div class="versionchanged"> | ||
− | <p><span class="versionmodified changed"> | + | <p><span class="versionmodified changed"> 3.7 版更改: </span> 属性 [[#http.cookies.Morsel.key|key]]、[[#http.cookies.Morsel.value|value]] 和 [[#http.cookies.Morsel.coded_value|coded_value]] 是只读的。 使用 [[#http.cookies.Morsel.set|set()]] 来设置它们。</p> |
− | [[#http.cookies.Morsel.coded_value| | ||
− | |||
</div> | </div> | ||
<div class="versionchanged"> | <div class="versionchanged"> | ||
− | <p><span class="versionmodified changed"> | + | <p><span class="versionmodified changed"> 3.8 版更改: </span> 添加了对 <code>samesite</code> 属性的支持。</p> |
</div></dd></dl> | </div></dd></dl> | ||
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">Morsel.</span></span><span class="sig-name descname"><span class="pre">value</span></span> |
− | : | + | : cookie 的值。 |
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">Morsel.</span></span><span class="sig-name descname"><span class="pre">coded_value</span></span> |
− | : | + | : cookie 的编码值——这是应该发送的。 |
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">Morsel.</span></span><span class="sig-name descname"><span class="pre">key</span></span> |
− | : | + | : cookie 的名称。 |
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">Morsel.</span></span><span class="sig-name descname"><span class="pre">set</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">key</span></span>'', ''<span class="n"><span class="pre">value</span></span>'', ''<span class="n"><span class="pre">coded_value</span></span>''<span class="sig-paren">)</span> |
− | : | + | : 设置 ''key''、''value'' 和 ''coded_value'' 属性。 |
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">Morsel.</span></span><span class="sig-name descname"><span class="pre">isReservedKey</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">K</span></span>''<span class="sig-paren">)</span> |
− | : | + | : ''K'' 是否是 [[#http.cookies.Morsel|Morsel]] 的键集的成员。 |
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">Morsel.</span></span><span class="sig-name descname"><span class="pre">output</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">attrs</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">header</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'Set-Cookie:'</span></span>''<span class="sig-paren">)</span> |
− | : | + | : 返回 Morsel 的字符串表示,适合作为 HTTP 标头发送。 默认情况下,所有属性都包含在内,除非给出 ''attrs'',在这种情况下,它应该是要使用的属性列表。 ''header'' 默认为 <code>"Set-Cookie:"</code>。 |
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">Morsel.</span></span><span class="sig-name descname"><span class="pre">js_output</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">attrs</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>''<span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>返回一个可嵌入的 JavaScript 片段,如果在支持 JavaScript 的浏览器上运行,它的行为与发送 HTTP 标头的行为相同。</p> |
− | + | <p>''attrs'' 的含义与 [[#http.cookies.Morsel.output|output()]] 中的含义相同。</p></dd></dl> | |
− | <p> | ||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">Morsel.</span></span><span class="sig-name descname"><span class="pre">OutputString</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">attrs</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>''<span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>返回一个表示 Morsel 的字符串,不包含任何 HTTP 或 JavaScript。</p> |
− | + | <p>''attrs'' 的含义与 [[#http.cookies.Morsel.output|output()]] 中的含义相同。</p></dd></dl> | |
− | <p> | ||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">Morsel.</span></span><span class="sig-name descname"><span class="pre">update</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">values</span></span>''<span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>使用字典 ''values'' 中的值更新 Morsel 字典中的值。 如果 ''values'' dict 中的任何键不是有效的 <span id="index-6" class="target"></span>[https://tools.ietf.org/html/rfc2109.html RFC 2109] 属性,则会引发错误。</p> |
− | ''values'' | ||
− | |||
<div class="versionchanged"> | <div class="versionchanged"> | ||
− | <p><span class="versionmodified changed"> | + | <p><span class="versionmodified changed"> 3.5 版更改:</span> 无效密钥引发错误。</p> |
</div></dd></dl> | </div></dd></dl> | ||
<dl> | <dl> | ||
− | <dt>< | + | <dt><span class="sig-prename descclassname"><span class="pre">Morsel.</span></span><span class="sig-name descname"><span class="pre">copy</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">value</span></span>''<span class="sig-paren">)</span></dt> |
− | <dd><p> | + | <dd><p>返回 Morsel 对象的浅拷贝。</p> |
<div class="versionchanged"> | <div class="versionchanged"> | ||
− | <p><span class="versionmodified changed"> | + | <p><span class="versionmodified changed"> 3.5 版更改:</span> 返回一个 Morsel 对象而不是一个 dict。</p> |
</div></dd></dl> | </div></dd></dl> | ||
− | ; < | + | ; <span class="sig-prename descclassname"><span class="pre">Morsel.</span></span><span class="sig-name descname"><span class="pre">setdefault</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">key</span></span>'', ''<span class="n"><span class="pre">value</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>''<span class="sig-paren">)</span> |
− | : | + | : 如果密钥不是有效的 <span id="index-7" class="target"></span>[https://tools.ietf.org/html/rfc2109.html RFC 2109] 属性,则引发错误,否则行为与 [[../stdtypes#dict|dict.setdefault()]] 相同。 |
第209行: | 第182行: | ||
<span id="cookie-example"></span> | <span id="cookie-example"></span> | ||
− | == | + | == 例子 == |
− | + | 以下示例演示了如何使用 [[#module-http.cookies|http.cookies]] 模块。 | |
<div class="highlight-pycon3 notranslate"> | <div class="highlight-pycon3 notranslate"> | ||
第217行: | 第190行: | ||
<div class="highlight"> | <div class="highlight"> | ||
− | <pre>>>> from http import cookies | + | <pre class="pycon3">>>> from http import cookies |
>>> C = cookies.SimpleCookie() | >>> C = cookies.SimpleCookie() | ||
>>> C["fig"] = "newton" | >>> C["fig"] = "newton" | ||
第268行: | 第241行: | ||
</div> | </div> | ||
+ | |||
+ | </div> | ||
+ | <div class="clearer"> | ||
+ | |||
+ | |||
</div> | </div> | ||
− | [[Category:Python 3.9 | + | [[Category:Python 3.9 文档]] |
2021年10月31日 (日) 04:52的最新版本