Files
hustoj/web/python-docs/library/xmlrpc.client.html
2025-03-09 17:10:56 +08:00

743 lines
75 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh_CN">
<head>
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
<title>xmlrpc.client --- XML-RPC 客户端访问 &#8212; Python 3.8.20 文档</title><meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="../_static/pydoctheme.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/language_data.js"></script>
<script src="../_static/translations.js"></script>
<script src="../_static/sidebar.js"></script>
<link rel="search" type="application/opensearchdescription+xml"
title="在 Python 3.8.20 文档 中搜索"
href="../_static/opensearch.xml"/>
<link rel="author" title="关于这些文档" href="../about.html" />
<link rel="index" title="索引" href="../genindex.html" />
<link rel="search" title="搜索" href="../search.html" />
<link rel="copyright" title="版权所有" href="../copyright.html" />
<link rel="next" title="xmlrpc.server --- 基本 XML-RPC 服务器" href="xmlrpc.server.html" />
<link rel="prev" title="xmlrpc --- XMLRPC 服务端与客户端模块" href="xmlrpc.html" />
<link rel="canonical" href="https://docs.python.org/3/library/xmlrpc.client.html" />
<style>
@media only screen {
table.full-width-table {
width: 100%;
}
}
</style>
<link rel="shortcut icon" type="image/png" href="../_static/py.svg" />
<script type="text/javascript" src="../_static/copybutton.js"></script>
<script type="text/javascript" src="../_static/menu.js"></script>
</head>
<body>
<div class="mobile-nav">
<input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"
aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu" />
<label for="menuToggler" class="toggler__label">
<span></span>
</label>
<nav class="nav-content" role="navigation">
<a href="https://www.python.org/" class="nav-logo">
<img src="../_static/py.svg" alt="Logo"/>
</a>
<div class="version_switcher_placeholder"></div>
<form role="search" class="search" action="../search.html" method="get">
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">
<path fill-rule="nonzero"
d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 001.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 00-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 005.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z" fill="#444"></path>
</svg>
<input type="text" name="q" aria-label="快速搜索"/>
<input type="submit" value="转向"/>
</form>
</nav>
<div class="menu-wrapper">
<nav class="menu" role="navigation" aria-label="main navigation">
<div class="language_switcher_placeholder"></div>
<h3><a href="../contents.html">目录</a></h3>
<ul>
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xmlrpc.client</span></code> --- XML-RPC 客户端访问</a><ul>
<li><a class="reference internal" href="#serverproxy-objects">ServerProxy 对象</a></li>
<li><a class="reference internal" href="#datetime-objects">DateTime 对象</a></li>
<li><a class="reference internal" href="#binary-objects">Binary 对象</a></li>
<li><a class="reference internal" href="#fault-objects">Fault 对象</a></li>
<li><a class="reference internal" href="#protocolerror-objects">ProtocolError 对象</a></li>
<li><a class="reference internal" href="#multicall-objects">MultiCall 对象</a></li>
<li><a class="reference internal" href="#convenience-functions">便捷函数</a></li>
<li><a class="reference internal" href="#example-of-client-usage">客户端用法的示例</a></li>
<li><a class="reference internal" href="#example-of-client-and-server-usage">客户端与服务器用法的示例</a></li>
</ul>
</li>
</ul>
<h4>上一个主题</h4>
<p class="topless"><a href="xmlrpc.html"
title="上一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xmlrpc</span></code> --- XMLRPC 服务端与客户端模块</a></p>
<h4>下一个主题</h4>
<p class="topless"><a href="xmlrpc.server.html"
title="下一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xmlrpc.server</span></code> --- 基本 XML-RPC 服务器</a></p>
<div role="note" aria-label="source link">
<h3>本页</h3>
<ul class="this-page-menu">
<li><a href="../bugs.html">报告 Bug</a></li>
<li>
<a href="https://github.com/python/cpython/blob/3.8/Doc/library/xmlrpc.client.rst"
rel="nofollow">显示源代码
</a>
</li>
</ul>
</div>
</nav>
</div>
</div>
<div id="outdated-warning" style="padding: .5em; text-align: center; background-color: #FFBABA; color: #6A0E0E;">
这个文档所针对的是一个已不再受支持的 Python 旧版本。
你应当升级版本,并阅读
<a href="/3/library/xmlrpc.client.html"> Python 当前稳定版本的文档</a>.
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>导航</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="总目录"
accesskey="I">索引</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python 模块索引"
>模块</a> |</li>
<li class="right" >
<a href="xmlrpc.server.html" title="xmlrpc.server --- 基本 XML-RPC 服务器"
accesskey="N">下一页</a> |</li>
<li class="right" >
<a href="xmlrpc.html" title="xmlrpc --- XMLRPC 服务端与客户端模块"
accesskey="P">上一页</a> |</li>
<li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
<li><a href="https://www.python.org/">Python</a> &#187;</li>
<li class="switchers">
<div class="language_switcher_placeholder"></div>
<div class="version_switcher_placeholder"></div>
</li>
<li>
</li>
<li id="cpython-language-and-version">
<a href="../index.html">3.8.20 Documentation</a> &#187;
</li>
<li class="nav-item nav-item-1"><a href="index.html" >Python 标准库</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="internet.html" accesskey="U">互联网协议和支持</a> &#187;</li>
<li class="right">
<div class="inline-search" role="search">
<form class="inline-search" action="../search.html" method="get">
<input placeholder="快速搜索" aria-label="快速搜索" type="text" name="q" />
<input type="submit" value="转向" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
|
</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<section id="module-xmlrpc.client">
<span id="xmlrpc-client-xml-rpc-client-access"></span><h1><a class="reference internal" href="#module-xmlrpc.client" title="xmlrpc.client: XML-RPC client access."><code class="xref py py-mod docutils literal notranslate"><span class="pre">xmlrpc.client</span></code></a> --- XML-RPC 客户端访问<a class="headerlink" href="#module-xmlrpc.client" title="永久链接至标题"></a></h1>
<p><strong>源代码:</strong> <a class="reference external" href="https://github.com/python/cpython/tree/3.8/Lib/xmlrpc/client.py">Lib/xmlrpc/client.py</a></p>
<hr class="docutils" />
<p>XML-RPC 是一种远程过程调用方法,它以使用 HTTP(S) 传递的 XML 作为载体。 通过它,客户端可以在远程服务器(服务器以 URI 指明)上调用带参数的方法并获取结构化的数据。 本模块支持编写 XML-RPC 客户端代码;它会处理在通用 Python 对象和 XML 之间进行在线翻译的所有细节。</p>
<div class="admonition warning">
<p class="admonition-title">警告</p>
<p><a class="reference internal" href="#module-xmlrpc.client" title="xmlrpc.client: XML-RPC client access."><code class="xref py py-mod docutils literal notranslate"><span class="pre">xmlrpc.client</span></code></a> 模块对于恶意构建的数据是不安全的。 如果你需要解析不受信任或未经身份验证的数据,请参阅 <a class="reference internal" href="xml.html#xml-vulnerabilities"><span class="std std-ref">XML 漏洞</span></a></p>
</div>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.5 版更改: </span>对于 HTTPS URI现在 <a class="reference internal" href="#module-xmlrpc.client" title="xmlrpc.client: XML-RPC client access."><code class="xref py py-mod docutils literal notranslate"><span class="pre">xmlrpc.client</span></code></a> 默认会执行所有必要的证书和主机名检查。</p>
</div>
<dl class="class">
<dt id="xmlrpc.client.ServerProxy">
<em class="property">class </em><code class="sig-prename descclassname">xmlrpc.client.</code><code class="sig-name descname">ServerProxy</code><span class="sig-paren">(</span><em class="sig-param">uri</em>, <em class="sig-param">transport=None</em>, <em class="sig-param">encoding=None</em>, <em class="sig-param">verbose=False</em>, <em class="sig-param">allow_none=False</em>, <em class="sig-param">use_datetime=False</em>, <em class="sig-param">use_builtin_types=False</em>, <em class="sig-param">*</em>, <em class="sig-param">headers=()</em>, <em class="sig-param">context=None</em><span class="sig-paren">)</span><a class="headerlink" href="#xmlrpc.client.ServerProxy" title="永久链接至目标"></a></dt>
<dd><p><a class="reference internal" href="#xmlrpc.client.ServerProxy" title="xmlrpc.client.ServerProxy"><code class="xref py py-class docutils literal notranslate"><span class="pre">ServerProxy</span></code></a> 实例是管理与远程 XML-RPC 服务器通信的对象。 要求的第一个参数为 URI (统一资源定位符),通常就是服务器的 URL。 可选的第二个参数为传输工厂实例;在默认情况下对于 https: URL 是一个内部 <code class="xref py py-class docutils literal notranslate"><span class="pre">SafeTransport</span></code> 实例,在其他情况下则是一个内部 HTTP <code class="xref py py-class docutils literal notranslate"><span class="pre">Transport</span></code> 实例。 可选的第三个参数为编码格式,默认为 UTF-8。 可选的第四个参数为调试旗标。</p>
<p>下列形参控制所返回代理实例的使用。 如果 <em>allow_none</em> 为真值,则 Python 常量 <code class="docutils literal notranslate"><span class="pre">None</span></code> 将被转写为 XML默认行为是针对 <code class="docutils literal notranslate"><span class="pre">None</span></code> 引发 <a class="reference internal" href="exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">TypeError</span></code></a>。 这是对 XML-RPC 规格的一个常用扩展,但并不被所有客户端和服务器所支持;请参阅 <a class="reference external" href="https://web.archive.org/web/20130120074804/http://ontosys.com/xml-rpc/extensions.php">http://ontosys.com/xml-rpc/extensions.php</a> 了解详情。 <em>use_builtin_types</em> 旗标可被用来将日期/时间值表示为 <a class="reference internal" href="datetime.html#datetime.datetime" title="datetime.datetime"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.datetime</span></code></a> 对象而将二进制数据表示为 <a class="reference internal" href="stdtypes.html#bytes" title="bytes"><code class="xref py py-class docutils literal notranslate"><span class="pre">bytes</span></code></a> 对象;此旗标默认为假值。 <a class="reference internal" href="datetime.html#datetime.datetime" title="datetime.datetime"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.datetime</span></code></a>, <a class="reference internal" href="stdtypes.html#bytes" title="bytes"><code class="xref py py-class docutils literal notranslate"><span class="pre">bytes</span></code></a><a class="reference internal" href="stdtypes.html#bytearray" title="bytearray"><code class="xref py py-class docutils literal notranslate"><span class="pre">bytearray</span></code></a> 对象可以被传给调用操作。 <em>headers</em> 形参为可选的随每次请求发送的 HTTP 标头序列,其形式为包含代表标头名称和值的 2 元组的序列 (例如 <cite>[('Header-Name', 'value')]</cite>)。 已不再适用的 <em>use_datetime</em> 旗标与 <em>use_builtin_types</em> 类似但它只针对日期/时间值。</p>
</dd></dl>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.3 版更改: </span>增加了 <em>use_builtin_types</em> 旗标。</p>
</div>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.8 版更改: </span>增加了 <em>headers</em> 形参。</p>
<p>HTTP 和 HTTPS 传输均支持用于 HTTP 基本身份验证的 URL 语法扩展: <code class="docutils literal notranslate"><span class="pre">http://user:pass&#64;host:port/path</span></code><code class="docutils literal notranslate"><span class="pre">user:pass</span></code> 部分将以 base64 编码为 HTTP 'Authorization' 标头,并在发起调用 XML-RPC 方法时作为连接过程的一部分发送给远程服务器。 你只需要在远程服务器要求基本身份验证账号和密码时使用此语法。 如果提供了 HTTPS URL<em>context</em> 可以为 <a class="reference internal" href="ssl.html#ssl.SSLContext" title="ssl.SSLContext"><code class="xref py py-class docutils literal notranslate"><span class="pre">ssl.SSLContext</span></code></a> 并配置有下层 HTTPS 连接的 SSL 设置。</p>
<p>返回的实例是一个代理对象,具有可被用来在远程服务器上发起相应 RPC 调用的方法。 如果远程服务器支持内省 API则也可使用该代理对象在远程服务器上查询它所支持的方法服务发现并获取其他服务器相关的元数据</p>
<p>适用的类型(即可通过 XML 生成 marshall 对象),包括如下类型(除了已说明的例外,它们会被反 marshall 为同样的 Python 类型):</p>
<table class="docutils align-default">
<colgroup>
<col style="width: 29%" />
<col style="width: 71%" />
</colgroup>
<thead>
<tr class="row-odd"><th class="head"><p>XML-RPC类型</p></th>
<th class="head"><p>Python 类型</p></th>
</tr>
</thead>
<tbody>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">boolean</span></code></p></td>
<td><p><a class="reference internal" href="functions.html#bool" title="bool"><code class="xref py py-class docutils literal notranslate"><span class="pre">bool</span></code></a></p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">int</span></code>, <code class="docutils literal notranslate"><span class="pre">i1</span></code>, <code class="docutils literal notranslate"><span class="pre">i2</span></code>, <code class="docutils literal notranslate"><span class="pre">i4</span></code>, <code class="docutils literal notranslate"><span class="pre">i8</span></code> 或者 <code class="docutils literal notranslate"><span class="pre">biginteger</span></code></p></td>
<td><p><a class="reference internal" href="functions.html#int" title="int"><code class="xref py py-class docutils literal notranslate"><span class="pre">int</span></code></a> 的范围从 -2147483648 到 2147483647。值将获得 <code class="docutils literal notranslate"><span class="pre">&lt;int&gt;</span></code> 标志。</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">double</span></code><code class="docutils literal notranslate"><span class="pre">float</span></code></p></td>
<td><p><a class="reference internal" href="functions.html#float" title="float"><code class="xref py py-class docutils literal notranslate"><span class="pre">float</span></code></a>。值将获得 <code class="docutils literal notranslate"><span class="pre">&lt;double&gt;</span></code> 标志。</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">string</span></code></p></td>
<td><p><a class="reference internal" href="stdtypes.html#str" title="str"><code class="xref py py-class docutils literal notranslate"><span class="pre">str</span></code></a></p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">array</span></code></p></td>
<td><p><a class="reference internal" href="stdtypes.html#list" title="list"><code class="xref py py-class docutils literal notranslate"><span class="pre">list</span></code></a><a class="reference internal" href="stdtypes.html#tuple" title="tuple"><code class="xref py py-class docutils literal notranslate"><span class="pre">tuple</span></code></a> 包含整合元素。数组以 <a class="reference internal" href="stdtypes.html#list" title="list"><code class="xref py py-class docutils literal notranslate"><span class="pre">lists</span></code></a> 形式返回。</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">struct</span></code></p></td>
<td><p><a class="reference internal" href="stdtypes.html#dict" title="dict"><code class="xref py py-class docutils literal notranslate"><span class="pre">dict</span></code></a>。 键必须为字符串,值可以为任何适用的类型。 可以传入用户自定义类的对象;只有其 <a class="reference internal" href="stdtypes.html#object.__dict__" title="object.__dict__"><code class="xref py py-attr docutils literal notranslate"><span class="pre">__dict__</span></code></a> 属性会被传输。</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">dateTime.iso8601</span></code></p></td>
<td><p><a class="reference internal" href="#xmlrpc.client.DateTime" title="xmlrpc.client.DateTime"><code class="xref py py-class docutils literal notranslate"><span class="pre">DateTime</span></code></a><a class="reference internal" href="datetime.html#datetime.datetime" title="datetime.datetime"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.datetime</span></code></a>。返回的类型取决于 <em>use_builtin_types</em><em>use_datetime</em> 标志的值。</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">base64</span></code></p></td>
<td><p><a class="reference internal" href="#xmlrpc.client.Binary" title="xmlrpc.client.Binary"><code class="xref py py-class docutils literal notranslate"><span class="pre">Binary</span></code></a>, <a class="reference internal" href="stdtypes.html#bytes" title="bytes"><code class="xref py py-class docutils literal notranslate"><span class="pre">bytes</span></code></a><a class="reference internal" href="stdtypes.html#bytearray" title="bytearray"><code class="xref py py-class docutils literal notranslate"><span class="pre">bytearray</span></code></a>。返回的类型取决于 <em>use_builtin_types</em> 标志的值。</p></td>
</tr>
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">nil</span></code></p></td>
<td><p><code class="docutils literal notranslate"><span class="pre">None</span></code> 常量。仅当 <em>allow_none</em> 为true时才允许传递。</p></td>
</tr>
<tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">bigdecimal</span></code></p></td>
<td><p><a class="reference internal" href="decimal.html#decimal.Decimal" title="decimal.Decimal"><code class="xref py py-class docutils literal notranslate"><span class="pre">decimal.Decimal</span></code></a>. 仅返回类型。</p></td>
</tr>
</tbody>
</table>
<p>这是This is the full set of data types supported by XML-RPC 所支持数据类型的完整集合。 方法调用也可能引发一个特殊的 <a class="reference internal" href="#xmlrpc.client.Fault" title="xmlrpc.client.Fault"><code class="xref py py-exc docutils literal notranslate"><span class="pre">Fault</span></code></a> 实例,用来提示 XML-RPC 服务器错误,或是用 <a class="reference internal" href="#xmlrpc.client.ProtocolError" title="xmlrpc.client.ProtocolError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ProtocolError</span></code></a> 来提示 HTTP/HTTPS 传输层中的错误。 <a class="reference internal" href="#xmlrpc.client.Fault" title="xmlrpc.client.Fault"><code class="xref py py-exc docutils literal notranslate"><span class="pre">Fault</span></code></a><a class="reference internal" href="#xmlrpc.client.ProtocolError" title="xmlrpc.client.ProtocolError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ProtocolError</span></code></a> 都派生自名为 <code class="xref py py-exc docutils literal notranslate"><span class="pre">Error</span></code> 的基类。 请注意 xmlrpc client 模块目前不可 marshal 内置类型的子类的实例。</p>
<p>当传入字符串时XML 中的特殊字符如 <code class="docutils literal notranslate"><span class="pre">&lt;</span></code>, <code class="docutils literal notranslate"><span class="pre">&gt;</span></code><code class="docutils literal notranslate"><span class="pre">&amp;</span></code> 将被自动转义。 但是,调用方有责任确保字符串中没有 XML 中不允许的字符,例如 ASCII 值在 0 和 31 之间的控制字符(当然,制表、换行和回车除外);不这样做将导致 XML-RPC 请求的 XML 格式不正确。 如果你必须通过 XML-RPC 传入任意字节数据,请使用 <a class="reference internal" href="stdtypes.html#bytes" title="bytes"><code class="xref py py-class docutils literal notranslate"><span class="pre">bytes</span></code></a><a class="reference internal" href="stdtypes.html#bytearray" title="bytearray"><code class="xref py py-class docutils literal notranslate"><span class="pre">bytearray</span></code></a> 类或者下文描述的 <a class="reference internal" href="#xmlrpc.client.Binary" title="xmlrpc.client.Binary"><code class="xref py py-class docutils literal notranslate"><span class="pre">Binary</span></code></a> 包装器类。</p>
<p><code class="xref py py-class docutils literal notranslate"><span class="pre">Server</span></code> 被保留作为 <a class="reference internal" href="#xmlrpc.client.ServerProxy" title="xmlrpc.client.ServerProxy"><code class="xref py py-class docutils literal notranslate"><span class="pre">ServerProxy</span></code></a> 的别名用于向下兼容。 新的代码应当使用 <a class="reference internal" href="#xmlrpc.client.ServerProxy" title="xmlrpc.client.ServerProxy"><code class="xref py py-class docutils literal notranslate"><span class="pre">ServerProxy</span></code></a></p>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.5 版更改: </span>增加了 <em>context</em> 参数。</p>
</div>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.6 版更改: </span>增加了对带有前缀的类型标签的支持 (例如 <code class="docutils literal notranslate"><span class="pre">ex:nil</span></code>)。 增加了对反 marshall 被 Apache XML-RPC 实现用于表示数值的附加类型的支持: <code class="docutils literal notranslate"><span class="pre">i1</span></code>, <code class="docutils literal notranslate"><span class="pre">i2</span></code>, <code class="docutils literal notranslate"><span class="pre">i8</span></code>, <code class="docutils literal notranslate"><span class="pre">biginteger</span></code>, <code class="docutils literal notranslate"><span class="pre">float</span></code><code class="docutils literal notranslate"><span class="pre">bigdecimal</span></code>。 请参阅 <a class="reference external" href="http://ws.apache.org/xmlrpc/types.html">http://ws.apache.org/xmlrpc/types.html</a> 了解详情。</p>
</div>
</div>
<div class="admonition seealso">
<p class="admonition-title">参见</p>
<dl class="simple">
<dt><a class="reference external" href="http://www.tldp.org/HOWTO/XML-RPC-HOWTO/index.html">XML-RPC HOWTO</a></dt><dd><p>以多种语言对 XML-RPC 操作和客户端软件进行了很好的说明。 包含 XML-RPC 客户端开发者所需知道的几乎任何事情。</p>
</dd>
<dt><a class="reference external" href="http://xmlrpc-c.sourceforge.net/introspection.html">XML-RPC Introspection</a></dt><dd><p>描述了用于内省的 XML-RPC 协议扩展。</p>
</dd>
<dt><a class="reference external" href="http://xmlrpc.scripting.com/spec.html">XML-RPC Specification</a></dt><dd><p>官方规范说明。</p>
</dd>
<dt><a class="reference external" href="http://effbot.org/zone/xmlrpc-errata.htm">Unofficial XML-RPC Errata</a></dt><dd><p>Fredrik Lundh 的 &quot;非官方勘误表,旨在澄清 XML-RPC 规范说明的某些细节,以及关于在设计你自己的 XML-RPC 实现时的 '最佳实践' 的提示。&quot;</p>
</dd>
</dl>
</div>
<section id="serverproxy-objects">
<span id="id1"></span><h2>ServerProxy 对象<a class="headerlink" href="#serverproxy-objects" title="永久链接至标题"></a></h2>
<p><a class="reference internal" href="#xmlrpc.client.ServerProxy" title="xmlrpc.client.ServerProxy"><code class="xref py py-class docutils literal notranslate"><span class="pre">ServerProxy</span></code></a> 实例有一个方法与 XML-RPC 服务器所接受的每个远程过程调用相对应。 调用该方法会执行一个 RPC通过名称和参数签名来调度例如同一个方法名可通过多个参数签名来重载。 RPC 结束时返回一个值,它可以是适用类型的返回数据或是表示错误的 <a class="reference internal" href="#xmlrpc.client.Fault" title="xmlrpc.client.Fault"><code class="xref py py-class docutils literal notranslate"><span class="pre">Fault</span></code></a><a class="reference internal" href="#xmlrpc.client.ProtocolError" title="xmlrpc.client.ProtocolError"><code class="xref py py-class docutils literal notranslate"><span class="pre">ProtocolError</span></code></a> 对象。</p>
<p>支持 XML 内省 API 的服务器还支持一些以保留的 <code class="xref py py-attr docutils literal notranslate"><span class="pre">system</span></code> 属性分组的通用方法:</p>
<dl class="method">
<dt id="xmlrpc.client.ServerProxy.system.listMethods">
<code class="sig-prename descclassname">ServerProxy.system.</code><code class="sig-name descname">listMethods</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#xmlrpc.client.ServerProxy.system.listMethods" title="永久链接至目标"></a></dt>
<dd><p>此方法返回一个字符串列表,每个字符串都各自对应 XML-RPC 服务器所支持的(非系统)方法。</p>
</dd></dl>
<dl class="method">
<dt id="xmlrpc.client.ServerProxy.system.methodSignature">
<code class="sig-prename descclassname">ServerProxy.system.</code><code class="sig-name descname">methodSignature</code><span class="sig-paren">(</span><em class="sig-param">name</em><span class="sig-paren">)</span><a class="headerlink" href="#xmlrpc.client.ServerProxy.system.methodSignature" title="永久链接至目标"></a></dt>
<dd><p>此方法接受一个形参,即某个由 XML-RPC 服务器所实现的方法名称。 它返回一个由此方法可能的签名组成的数组。 一个签名就是一个类型数组。 这些类型中的第一个是方法的的返回类型,其余的均为形参。</p>
<p>由于允许多个签名(即重载),此方法是返回一个签名列表而非一个单例。</p>
<p>签名本身被限制为一个方法所期望的最高层级形参。 举例来说如果一个方法期望有一个结构体数组作为形参,并返回一个字符串,则其签名就是 &quot;string, array&quot;。 如果它期望有三个整数并返回一个字符串,则其签名是 &quot;string, int, int, int&quot;</p>
<p>如果方法没有定义任何签名,则将返回一个非数组值。 在 Python 中这意味着返回值的类型为列表以外的类型。</p>
</dd></dl>
<dl class="method">
<dt id="xmlrpc.client.ServerProxy.system.methodHelp">
<code class="sig-prename descclassname">ServerProxy.system.</code><code class="sig-name descname">methodHelp</code><span class="sig-paren">(</span><em class="sig-param">name</em><span class="sig-paren">)</span><a class="headerlink" href="#xmlrpc.client.ServerProxy.system.methodHelp" title="永久链接至目标"></a></dt>
<dd><p>此方法接受一个形参,即 XML-RPC 服务器所实现的某个方法的名称。 它返回描述相应方法用法的文档字符串。 如果没有可用的文档字符串,则返回空字符串。 文档字符串可以包含 HTML 标记。</p>
</dd></dl>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.5 版更改: </span><a class="reference internal" href="#xmlrpc.client.ServerProxy" title="xmlrpc.client.ServerProxy"><code class="xref py py-class docutils literal notranslate"><span class="pre">ServerProxy</span></code></a> 的实例支持 <a class="reference internal" href="../glossary.html#term-context-manager"><span class="xref std std-term">context manager</span></a> 协议用于关闭下层传输。</p>
</div>
<p>以下是一个可运行的示例。 服务器端代码:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">xmlrpc.server</span> <span class="kn">import</span> <span class="n">SimpleXMLRPCServer</span>
<span class="k">def</span> <span class="nf">is_even</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
<span class="k">return</span> <span class="n">n</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span>
<span class="n">server</span> <span class="o">=</span> <span class="n">SimpleXMLRPCServer</span><span class="p">((</span><span class="s2">&quot;localhost&quot;</span><span class="p">,</span> <span class="mi">8000</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Listening on port 8000...&quot;</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">register_function</span><span class="p">(</span><span class="n">is_even</span><span class="p">,</span> <span class="s2">&quot;is_even&quot;</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">serve_forever</span><span class="p">()</span>
</pre></div>
</div>
<p>前述服务器的客户端代码:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">xmlrpc.client</span>
<span class="k">with</span> <span class="n">xmlrpc</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">ServerProxy</span><span class="p">(</span><span class="s2">&quot;http://localhost:8000/&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">proxy</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;3 is even: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="nb">str</span><span class="p">(</span><span class="n">proxy</span><span class="o">.</span><span class="n">is_even</span><span class="p">(</span><span class="mi">3</span><span class="p">)))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;100 is even: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="nb">str</span><span class="p">(</span><span class="n">proxy</span><span class="o">.</span><span class="n">is_even</span><span class="p">(</span><span class="mi">100</span><span class="p">)))</span>
</pre></div>
</div>
</section>
<section id="datetime-objects">
<span id="id2"></span><h2>DateTime 对象<a class="headerlink" href="#datetime-objects" title="永久链接至标题"></a></h2>
<dl class="class">
<dt id="xmlrpc.client.DateTime">
<em class="property">class </em><code class="sig-prename descclassname">xmlrpc.client.</code><code class="sig-name descname">DateTime</code><a class="headerlink" href="#xmlrpc.client.DateTime" title="永久链接至目标"></a></dt>
<dd><p>该类的初始化可以使用距离 Unix 纪元的秒数、时间元组、ISO 8601 时间/日期字符串或 <a class="reference internal" href="datetime.html#datetime.datetime" title="datetime.datetime"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.datetime</span></code></a> 实例。 它具有下列方法,主要是为 marshall 和反 marshall 代码的内部使用提供支持:</p>
<dl class="method">
<dt id="xmlrpc.client.DateTime.decode">
<code class="sig-name descname">decode</code><span class="sig-paren">(</span><em class="sig-param">string</em><span class="sig-paren">)</span><a class="headerlink" href="#xmlrpc.client.DateTime.decode" title="永久链接至目标"></a></dt>
<dd><p>接受一个字符串作为实例的新时间值。</p>
</dd></dl>
<dl class="method">
<dt id="xmlrpc.client.DateTime.encode">
<code class="sig-name descname">encode</code><span class="sig-paren">(</span><em class="sig-param">out</em><span class="sig-paren">)</span><a class="headerlink" href="#xmlrpc.client.DateTime.encode" title="永久链接至目标"></a></dt>
<dd><p>将此 <a class="reference internal" href="#xmlrpc.client.DateTime" title="xmlrpc.client.DateTime"><code class="xref py py-class docutils literal notranslate"><span class="pre">DateTime</span></code></a> 条目的 XML-RPC 编码格式写入到 <em>out</em> 流对象。</p>
</dd></dl>
<p>它还通过富比较和 <a class="reference internal" href="../reference/datamodel.html#object.__repr__" title="object.__repr__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__repr__()</span></code></a> 方法来支持某些 Python 内置操作。</p>
</dd></dl>
<p>以下是一个可运行的示例。 服务器端代码:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">datetime</span>
<span class="kn">from</span> <span class="nn">xmlrpc.server</span> <span class="kn">import</span> <span class="n">SimpleXMLRPCServer</span>
<span class="kn">import</span> <span class="nn">xmlrpc.client</span>
<span class="k">def</span> <span class="nf">today</span><span class="p">():</span>
<span class="n">today</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">today</span><span class="p">()</span>
<span class="k">return</span> <span class="n">xmlrpc</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">DateTime</span><span class="p">(</span><span class="n">today</span><span class="p">)</span>
<span class="n">server</span> <span class="o">=</span> <span class="n">SimpleXMLRPCServer</span><span class="p">((</span><span class="s2">&quot;localhost&quot;</span><span class="p">,</span> <span class="mi">8000</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Listening on port 8000...&quot;</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">register_function</span><span class="p">(</span><span class="n">today</span><span class="p">,</span> <span class="s2">&quot;today&quot;</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">serve_forever</span><span class="p">()</span>
</pre></div>
</div>
<p>前述服务器的客户端代码:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">xmlrpc.client</span>
<span class="kn">import</span> <span class="nn">datetime</span>
<span class="n">proxy</span> <span class="o">=</span> <span class="n">xmlrpc</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">ServerProxy</span><span class="p">(</span><span class="s2">&quot;http://localhost:8000/&quot;</span><span class="p">)</span>
<span class="n">today</span> <span class="o">=</span> <span class="n">proxy</span><span class="o">.</span><span class="n">today</span><span class="p">()</span>
<span class="c1"># convert the ISO8601 string to a datetime object</span>
<span class="n">converted</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">today</span><span class="o">.</span><span class="n">value</span><span class="p">,</span> <span class="s2">&quot;%Y%m</span><span class="si">%d</span><span class="s2">T%H:%M:%S&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Today: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">converted</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%d</span><span class="s2">.%m.%Y, %H:%M&quot;</span><span class="p">))</span>
</pre></div>
</div>
</section>
<section id="binary-objects">
<span id="id3"></span><h2>Binary 对象<a class="headerlink" href="#binary-objects" title="永久链接至标题"></a></h2>
<dl class="class">
<dt id="xmlrpc.client.Binary">
<em class="property">class </em><code class="sig-prename descclassname">xmlrpc.client.</code><code class="sig-name descname">Binary</code><a class="headerlink" href="#xmlrpc.client.Binary" title="永久链接至目标"></a></dt>
<dd><p>该类的初始化可以使用字节数据(可包括 NUL。 对 <a class="reference internal" href="#xmlrpc.client.Binary" title="xmlrpc.client.Binary"><code class="xref py py-class docutils literal notranslate"><span class="pre">Binary</span></code></a> 对象的初始访问是由一个属性来提供的:</p>
<dl class="attribute">
<dt id="xmlrpc.client.Binary.data">
<code class="sig-name descname">data</code><a class="headerlink" href="#xmlrpc.client.Binary.data" title="永久链接至目标"></a></dt>
<dd><p><a class="reference internal" href="#xmlrpc.client.Binary" title="xmlrpc.client.Binary"><code class="xref py py-class docutils literal notranslate"><span class="pre">Binary</span></code></a> 实例封装的二进制数据。 该数据以 <a class="reference internal" href="stdtypes.html#bytes" title="bytes"><code class="xref py py-class docutils literal notranslate"><span class="pre">bytes</span></code></a> 对象的形式提供。</p>
</dd></dl>
<p><a class="reference internal" href="#xmlrpc.client.Binary" title="xmlrpc.client.Binary"><code class="xref py py-class docutils literal notranslate"><span class="pre">Binary</span></code></a> 对象具有下列方法,支持这些方法主要是供 marshall 和反 marshall 代码在内部使用:</p>
<dl class="method">
<dt id="xmlrpc.client.Binary.decode">
<code class="sig-name descname">decode</code><span class="sig-paren">(</span><em class="sig-param">bytes</em><span class="sig-paren">)</span><a class="headerlink" href="#xmlrpc.client.Binary.decode" title="永久链接至目标"></a></dt>
<dd><p>接受一个 base64 <a class="reference internal" href="stdtypes.html#bytes" title="bytes"><code class="xref py py-class docutils literal notranslate"><span class="pre">bytes</span></code></a> 对象并将其解码为实例的新数据。</p>
</dd></dl>
<dl class="method">
<dt id="xmlrpc.client.Binary.encode">
<code class="sig-name descname">encode</code><span class="sig-paren">(</span><em class="sig-param">out</em><span class="sig-paren">)</span><a class="headerlink" href="#xmlrpc.client.Binary.encode" title="永久链接至目标"></a></dt>
<dd><p>将此二进制条目的 XML-RPC base 64 编码格式写入到 <em>out</em> 流对象。</p>
<p>被编码数据将依据 <span class="target" id="index-2"></span><a class="rfc reference external" href="https://tools.ietf.org/html/rfc2045.html#section-6.8"><strong>RFC 2045 第 6.8 节</strong></a> 每 76 个字符换行一次,这是撰写 XML-RPC 规范说明时 base64 规范的事实标准。</p>
</dd></dl>
<p>它还通过 <a class="reference internal" href="../reference/datamodel.html#object.__eq__" title="object.__eq__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__eq__()</span></code></a><a class="reference internal" href="../reference/datamodel.html#object.__ne__" title="object.__ne__"><code class="xref py py-meth docutils literal notranslate"><span class="pre">__ne__()</span></code></a> 方法来支持某些 Python 内置运算符。</p>
</dd></dl>
<p>该二进制对象的示例用法。 我们将通过 XMLRPC 来传输一张图片:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">xmlrpc.server</span> <span class="kn">import</span> <span class="n">SimpleXMLRPCServer</span>
<span class="kn">import</span> <span class="nn">xmlrpc.client</span>
<span class="k">def</span> <span class="nf">python_logo</span><span class="p">():</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&quot;python_logo.jpg&quot;</span><span class="p">,</span> <span class="s2">&quot;rb&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">handle</span><span class="p">:</span>
<span class="k">return</span> <span class="n">xmlrpc</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">Binary</span><span class="p">(</span><span class="n">handle</span><span class="o">.</span><span class="n">read</span><span class="p">())</span>
<span class="n">server</span> <span class="o">=</span> <span class="n">SimpleXMLRPCServer</span><span class="p">((</span><span class="s2">&quot;localhost&quot;</span><span class="p">,</span> <span class="mi">8000</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Listening on port 8000...&quot;</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">register_function</span><span class="p">(</span><span class="n">python_logo</span><span class="p">,</span> <span class="s1">&#39;python_logo&#39;</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">serve_forever</span><span class="p">()</span>
</pre></div>
</div>
<p>客户端会获取图片并将其保存为一个文件:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">xmlrpc.client</span>
<span class="n">proxy</span> <span class="o">=</span> <span class="n">xmlrpc</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">ServerProxy</span><span class="p">(</span><span class="s2">&quot;http://localhost:8000/&quot;</span><span class="p">)</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s2">&quot;fetched_python_logo.jpg&quot;</span><span class="p">,</span> <span class="s2">&quot;wb&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">handle</span><span class="p">:</span>
<span class="n">handle</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">proxy</span><span class="o">.</span><span class="n">python_logo</span><span class="p">()</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="fault-objects">
<span id="id4"></span><h2>Fault 对象<a class="headerlink" href="#fault-objects" title="永久链接至标题"></a></h2>
<dl class="class">
<dt id="xmlrpc.client.Fault">
<em class="property">class </em><code class="sig-prename descclassname">xmlrpc.client.</code><code class="sig-name descname">Fault</code><a class="headerlink" href="#xmlrpc.client.Fault" title="永久链接至目标"></a></dt>
<dd><p><a class="reference internal" href="#xmlrpc.client.Fault" title="xmlrpc.client.Fault"><code class="xref py py-class docutils literal notranslate"><span class="pre">Fault</span></code></a> 对象封装了 XML-RPC fault 标签的内容。 Fault 对象具有下列属性:</p>
<dl class="attribute">
<dt id="xmlrpc.client.Fault.faultCode">
<code class="sig-name descname">faultCode</code><a class="headerlink" href="#xmlrpc.client.Fault.faultCode" title="永久链接至目标"></a></dt>
<dd><p>A string indicating the fault type.</p>
</dd></dl>
<dl class="attribute">
<dt id="xmlrpc.client.Fault.faultString">
<code class="sig-name descname">faultString</code><a class="headerlink" href="#xmlrpc.client.Fault.faultString" title="永久链接至目标"></a></dt>
<dd><p>一个包含与 fault 相关联的诊断消息的字符串。</p>
</dd></dl>
</dd></dl>
<p>在接下来的示例中我们将通过返回一个复数类型的值来故意引发一个 <a class="reference internal" href="#xmlrpc.client.Fault" title="xmlrpc.client.Fault"><code class="xref py py-exc docutils literal notranslate"><span class="pre">Fault</span></code></a>。 服务器端代码:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">xmlrpc.server</span> <span class="kn">import</span> <span class="n">SimpleXMLRPCServer</span>
<span class="c1"># A marshalling error is going to occur because we&#39;re returning a</span>
<span class="c1"># complex number</span>
<span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="k">return</span> <span class="n">x</span><span class="o">+</span><span class="n">y</span><span class="o">+</span><span class="mi">0</span><span class="n">j</span>
<span class="n">server</span> <span class="o">=</span> <span class="n">SimpleXMLRPCServer</span><span class="p">((</span><span class="s2">&quot;localhost&quot;</span><span class="p">,</span> <span class="mi">8000</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Listening on port 8000...&quot;</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">register_function</span><span class="p">(</span><span class="n">add</span><span class="p">,</span> <span class="s1">&#39;add&#39;</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">serve_forever</span><span class="p">()</span>
</pre></div>
</div>
<p>前述服务器的客户端代码:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">xmlrpc.client</span>
<span class="n">proxy</span> <span class="o">=</span> <span class="n">xmlrpc</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">ServerProxy</span><span class="p">(</span><span class="s2">&quot;http://localhost:8000/&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">proxy</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">5</span><span class="p">)</span>
<span class="k">except</span> <span class="n">xmlrpc</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">Fault</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;A fault occurred&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Fault code: </span><span class="si">%d</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">err</span><span class="o">.</span><span class="n">faultCode</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Fault string: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">err</span><span class="o">.</span><span class="n">faultString</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="protocolerror-objects">
<span id="protocol-error-objects"></span><h2>ProtocolError 对象<a class="headerlink" href="#protocolerror-objects" title="永久链接至标题"></a></h2>
<dl class="class">
<dt id="xmlrpc.client.ProtocolError">
<em class="property">class </em><code class="sig-prename descclassname">xmlrpc.client.</code><code class="sig-name descname">ProtocolError</code><a class="headerlink" href="#xmlrpc.client.ProtocolError" title="永久链接至目标"></a></dt>
<dd><p><a class="reference internal" href="#xmlrpc.client.ProtocolError" title="xmlrpc.client.ProtocolError"><code class="xref py py-class docutils literal notranslate"><span class="pre">ProtocolError</span></code></a> 对象描述了下层传输层中的协议错误(例如当 URI 所指定的服务器不存在时的 404 'not found' 错误)。 它具有下列属性:</p>
<dl class="attribute">
<dt id="xmlrpc.client.ProtocolError.url">
<code class="sig-name descname">url</code><a class="headerlink" href="#xmlrpc.client.ProtocolError.url" title="永久链接至目标"></a></dt>
<dd><p>触发错误的 URI 或 URL。</p>
</dd></dl>
<dl class="attribute">
<dt id="xmlrpc.client.ProtocolError.errcode">
<code class="sig-name descname">errcode</code><a class="headerlink" href="#xmlrpc.client.ProtocolError.errcode" title="永久链接至目标"></a></dt>
<dd><p>错误代码。</p>
</dd></dl>
<dl class="attribute">
<dt id="xmlrpc.client.ProtocolError.errmsg">
<code class="sig-name descname">errmsg</code><a class="headerlink" href="#xmlrpc.client.ProtocolError.errmsg" title="永久链接至目标"></a></dt>
<dd><p>错误消息或诊断字符串。</p>
</dd></dl>
<dl class="attribute">
<dt id="xmlrpc.client.ProtocolError.headers">
<code class="sig-name descname">headers</code><a class="headerlink" href="#xmlrpc.client.ProtocolError.headers" title="永久链接至目标"></a></dt>
<dd><p>一个包含触发错误的 HTTP/HTTPS 请求的标头的字典。</p>
</dd></dl>
</dd></dl>
<p>在接下来的示例中我们将通过提供一个无效的 URI 来故意引发一个 <a class="reference internal" href="#xmlrpc.client.ProtocolError" title="xmlrpc.client.ProtocolError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ProtocolError</span></code></a>:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">xmlrpc.client</span>
<span class="c1"># create a ServerProxy with a URI that doesn&#39;t respond to XMLRPC requests</span>
<span class="n">proxy</span> <span class="o">=</span> <span class="n">xmlrpc</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">ServerProxy</span><span class="p">(</span><span class="s2">&quot;http://google.com/&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">proxy</span><span class="o">.</span><span class="n">some_method</span><span class="p">()</span>
<span class="k">except</span> <span class="n">xmlrpc</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">ProtocolError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;A protocol error occurred&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;URL: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">err</span><span class="o">.</span><span class="n">url</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;HTTP/HTTPS headers: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">err</span><span class="o">.</span><span class="n">headers</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Error code: </span><span class="si">%d</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">err</span><span class="o">.</span><span class="n">errcode</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Error message: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">err</span><span class="o">.</span><span class="n">errmsg</span><span class="p">)</span>
</pre></div>
</div>
</section>
<section id="multicall-objects">
<h2>MultiCall 对象<a class="headerlink" href="#multicall-objects" title="永久链接至标题"></a></h2>
<p><a class="reference internal" href="#xmlrpc.client.MultiCall" title="xmlrpc.client.MultiCall"><code class="xref py py-class docutils literal notranslate"><span class="pre">MultiCall</span></code></a> 对象提供了一种将对远程服务器的多个调用封装为一个单独请求的方式 <a class="footnote-reference brackets" href="#id6" id="id5">1</a></p>
<dl class="class">
<dt id="xmlrpc.client.MultiCall">
<em class="property">class </em><code class="sig-prename descclassname">xmlrpc.client.</code><code class="sig-name descname">MultiCall</code><span class="sig-paren">(</span><em class="sig-param">server</em><span class="sig-paren">)</span><a class="headerlink" href="#xmlrpc.client.MultiCall" title="永久链接至目标"></a></dt>
<dd><p>创建一个用于盒式方法调用的对象。 <em>server</em> 是调用的最终目标。 可以对结果对象发起调用,但它们将立即返回 <code class="docutils literal notranslate"><span class="pre">None</span></code>,并只在 <a class="reference internal" href="#xmlrpc.client.MultiCall" title="xmlrpc.client.MultiCall"><code class="xref py py-class docutils literal notranslate"><span class="pre">MultiCall</span></code></a> 对象中存储调用名称和形参。 调用该对象本身会导致所有已存储的调用作为一个单独的 <code class="docutils literal notranslate"><span class="pre">system.multicall</span></code> 请求被发送。 此调用的结果是一个 <a class="reference internal" href="../glossary.html#term-generator"><span class="xref std std-term">generator</span></a>;迭代这个生成器会产生各个结果。</p>
</dd></dl>
<p>以下是该类的用法示例。 服务器端代码:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">xmlrpc.server</span> <span class="kn">import</span> <span class="n">SimpleXMLRPCServer</span>
<span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="k">return</span> <span class="n">x</span> <span class="o">+</span> <span class="n">y</span>
<span class="k">def</span> <span class="nf">subtract</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="k">return</span> <span class="n">x</span> <span class="o">-</span> <span class="n">y</span>
<span class="k">def</span> <span class="nf">multiply</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="k">return</span> <span class="n">x</span> <span class="o">*</span> <span class="n">y</span>
<span class="k">def</span> <span class="nf">divide</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">):</span>
<span class="k">return</span> <span class="n">x</span> <span class="o">//</span> <span class="n">y</span>
<span class="c1"># A simple server with simple arithmetic functions</span>
<span class="n">server</span> <span class="o">=</span> <span class="n">SimpleXMLRPCServer</span><span class="p">((</span><span class="s2">&quot;localhost&quot;</span><span class="p">,</span> <span class="mi">8000</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Listening on port 8000...&quot;</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">register_multicall_functions</span><span class="p">()</span>
<span class="n">server</span><span class="o">.</span><span class="n">register_function</span><span class="p">(</span><span class="n">add</span><span class="p">,</span> <span class="s1">&#39;add&#39;</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">register_function</span><span class="p">(</span><span class="n">subtract</span><span class="p">,</span> <span class="s1">&#39;subtract&#39;</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">register_function</span><span class="p">(</span><span class="n">multiply</span><span class="p">,</span> <span class="s1">&#39;multiply&#39;</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">register_function</span><span class="p">(</span><span class="n">divide</span><span class="p">,</span> <span class="s1">&#39;divide&#39;</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">serve_forever</span><span class="p">()</span>
</pre></div>
</div>
<p>前述服务器的客户端代码:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">xmlrpc.client</span>
<span class="n">proxy</span> <span class="o">=</span> <span class="n">xmlrpc</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">ServerProxy</span><span class="p">(</span><span class="s2">&quot;http://localhost:8000/&quot;</span><span class="p">)</span>
<span class="n">multicall</span> <span class="o">=</span> <span class="n">xmlrpc</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">MultiCall</span><span class="p">(</span><span class="n">proxy</span><span class="p">)</span>
<span class="n">multicall</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="mi">7</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="n">multicall</span><span class="o">.</span><span class="n">subtract</span><span class="p">(</span><span class="mi">7</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="n">multicall</span><span class="o">.</span><span class="n">multiply</span><span class="p">(</span><span class="mi">7</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="n">multicall</span><span class="o">.</span><span class="n">divide</span><span class="p">(</span><span class="mi">7</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">multicall</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;7+3=</span><span class="si">%d</span><span class="s2">, 7-3=</span><span class="si">%d</span><span class="s2">, 7*3=</span><span class="si">%d</span><span class="s2">, 7//3=</span><span class="si">%d</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">result</span><span class="p">))</span>
</pre></div>
</div>
</section>
<section id="convenience-functions">
<h2>便捷函数<a class="headerlink" href="#convenience-functions" title="永久链接至标题"></a></h2>
<dl class="function">
<dt id="xmlrpc.client.dumps">
<code class="sig-prename descclassname">xmlrpc.client.</code><code class="sig-name descname">dumps</code><span class="sig-paren">(</span><em class="sig-param">params</em>, <em class="sig-param">methodname=None</em>, <em class="sig-param">methodresponse=None</em>, <em class="sig-param">encoding=None</em>, <em class="sig-param">allow_none=False</em><span class="sig-paren">)</span><a class="headerlink" href="#xmlrpc.client.dumps" title="永久链接至目标"></a></dt>
<dd><p><em>params</em> 转换为一个 XML-RPC 请求。 或者当 <em>methodresponse</em> 为真值时则转换为一个请求。 <em>params</em> 可以是一个参数元组或是一个 <a class="reference internal" href="#xmlrpc.client.Fault" title="xmlrpc.client.Fault"><code class="xref py py-exc docutils literal notranslate"><span class="pre">Fault</span></code></a> 异常类的实例。 如果 <em>methodresponse</em> 为真值,只有单独的值可以被返回,这意味着 <em>params</em> 的长度必须为 1。 如果提供了 <em>encoding</em>,则在生成的 XML 会使用该编码格式;默认的编码格式为 UTF-8。 Python 的 <a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal notranslate"><span class="pre">None</span></code></a> 值不可在标准 XML-RPC 中使用;要通过扩展来允许使用它,请为 <em>allow_none</em> 提供一个真值。</p>
</dd></dl>
<dl class="function">
<dt id="xmlrpc.client.loads">
<code class="sig-prename descclassname">xmlrpc.client.</code><code class="sig-name descname">loads</code><span class="sig-paren">(</span><em class="sig-param">data</em>, <em class="sig-param">use_datetime=False</em>, <em class="sig-param">use_builtin_types=False</em><span class="sig-paren">)</span><a class="headerlink" href="#xmlrpc.client.loads" title="永久链接至目标"></a></dt>
<dd><p>将一个 XML-RPC 请求或响应转换为 Python 对象 <code class="docutils literal notranslate"><span class="pre">(params,</span> <span class="pre">methodname)</span></code><em>params</em> 是一个参数元组;<em>methodname</em> 是一个字符串,或者如果数据包没有提供方法名则为 <code class="docutils literal notranslate"><span class="pre">None</span></code>。 如果 XML-RPC 数据包是代表一个故障条件,则此函数将引发一个 <a class="reference internal" href="#xmlrpc.client.Fault" title="xmlrpc.client.Fault"><code class="xref py py-exc docutils literal notranslate"><span class="pre">Fault</span></code></a> 异常。 <em>use_builtin_types</em> 旗标可被用于将日期/时间值表示为 <a class="reference internal" href="datetime.html#datetime.datetime" title="datetime.datetime"><code class="xref py py-class docutils literal notranslate"><span class="pre">datetime.datetime</span></code></a> 对象并将二进制数据表示为 <a class="reference internal" href="stdtypes.html#bytes" title="bytes"><code class="xref py py-class docutils literal notranslate"><span class="pre">bytes</span></code></a> 对象;此旗标默认为假值。</p>
<p>已过时的 <em>use_datetime</em> 旗标与 <em>use_builtin_types</em> 类似但只作用于日期/时间值。</p>
<div class="versionchanged">
<p><span class="versionmodified changed">在 3.3 版更改: </span>增加了 <em>use_builtin_types</em> 旗标。</p>
</div>
</dd></dl>
</section>
<section id="example-of-client-usage">
<span id="xmlrpc-client-example"></span><h2>客户端用法的示例<a class="headerlink" href="#example-of-client-usage" title="永久链接至标题"></a></h2>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># simple test program (from the XML-RPC specification)</span>
<span class="kn">from</span> <span class="nn">xmlrpc.client</span> <span class="kn">import</span> <span class="n">ServerProxy</span><span class="p">,</span> <span class="n">Error</span>
<span class="c1"># server = ServerProxy(&quot;http://localhost:8000&quot;) # local server</span>
<span class="k">with</span> <span class="n">ServerProxy</span><span class="p">(</span><span class="s2">&quot;http://betty.userland.com&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">proxy</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">proxy</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="n">proxy</span><span class="o">.</span><span class="n">examples</span><span class="o">.</span><span class="n">getStateName</span><span class="p">(</span><span class="mi">41</span><span class="p">))</span>
<span class="k">except</span> <span class="n">Error</span> <span class="k">as</span> <span class="n">v</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;ERROR&quot;</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
</pre></div>
</div>
<p>要通过 HTTP 代理访问一个 XML-RPC 服务器,你必须自行定义一个传输。 下面的例子演示了具体做法:</p>
<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">http.client</span>
<span class="kn">import</span> <span class="nn">xmlrpc.client</span>
<span class="k">class</span> <span class="nc">ProxiedTransport</span><span class="p">(</span><span class="n">xmlrpc</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">Transport</span><span class="p">):</span>
<span class="k">def</span> <span class="nf">set_proxy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">proxy</span> <span class="o">=</span> <span class="n">host</span><span class="p">,</span> <span class="n">port</span>
<span class="bp">self</span><span class="o">.</span><span class="n">proxy_headers</span> <span class="o">=</span> <span class="n">headers</span>
<span class="k">def</span> <span class="nf">make_connection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">host</span><span class="p">):</span>
<span class="n">connection</span> <span class="o">=</span> <span class="n">http</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">HTTPConnection</span><span class="p">(</span><span class="o">*</span><span class="bp">self</span><span class="o">.</span><span class="n">proxy</span><span class="p">)</span>
<span class="n">connection</span><span class="o">.</span><span class="n">set_tunnel</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">proxy_headers</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_connection</span> <span class="o">=</span> <span class="n">host</span><span class="p">,</span> <span class="n">connection</span>
<span class="k">return</span> <span class="n">connection</span>
<span class="n">transport</span> <span class="o">=</span> <span class="n">ProxiedTransport</span><span class="p">()</span>
<span class="n">transport</span><span class="o">.</span><span class="n">set_proxy</span><span class="p">(</span><span class="s1">&#39;proxy-server&#39;</span><span class="p">,</span> <span class="mi">8080</span><span class="p">)</span>
<span class="n">server</span> <span class="o">=</span> <span class="n">xmlrpc</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">ServerProxy</span><span class="p">(</span><span class="s1">&#39;http://betty.userland.com&#39;</span><span class="p">,</span> <span class="n">transport</span><span class="o">=</span><span class="n">transport</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">server</span><span class="o">.</span><span class="n">examples</span><span class="o">.</span><span class="n">getStateName</span><span class="p">(</span><span class="mi">41</span><span class="p">))</span>
</pre></div>
</div>
</section>
<section id="example-of-client-and-server-usage">
<h2>客户端与服务器用法的示例<a class="headerlink" href="#example-of-client-and-server-usage" title="永久链接至标题"></a></h2>
<p>参见 <a class="reference internal" href="xmlrpc.server.html#simplexmlrpcserver-example"><span class="std std-ref">SimpleXMLRPCServer 示例</span></a></p>
<p class="rubric">备注</p>
<dl class="footnote brackets">
<dt class="label" id="id6"><span class="brackets"><a class="fn-backref" href="#id5">1</a></span></dt>
<dd><p>此做法被首次提及是在 <a class="reference external" href="https://web.archive.org/web/20060624230303/http://www.xmlrpc.com/discuss/msgReader$1208?mode=topic">a discussion on xmlrpc.com</a></p>
</dd>
</dl>
</section>
</section>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<h3><a href="../contents.html">目录</a></h3>
<ul>
<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xmlrpc.client</span></code> --- XML-RPC 客户端访问</a><ul>
<li><a class="reference internal" href="#serverproxy-objects">ServerProxy 对象</a></li>
<li><a class="reference internal" href="#datetime-objects">DateTime 对象</a></li>
<li><a class="reference internal" href="#binary-objects">Binary 对象</a></li>
<li><a class="reference internal" href="#fault-objects">Fault 对象</a></li>
<li><a class="reference internal" href="#protocolerror-objects">ProtocolError 对象</a></li>
<li><a class="reference internal" href="#multicall-objects">MultiCall 对象</a></li>
<li><a class="reference internal" href="#convenience-functions">便捷函数</a></li>
<li><a class="reference internal" href="#example-of-client-usage">客户端用法的示例</a></li>
<li><a class="reference internal" href="#example-of-client-and-server-usage">客户端与服务器用法的示例</a></li>
</ul>
</li>
</ul>
<h4>上一个主题</h4>
<p class="topless"><a href="xmlrpc.html"
title="上一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xmlrpc</span></code> --- XMLRPC 服务端与客户端模块</a></p>
<h4>下一个主题</h4>
<p class="topless"><a href="xmlrpc.server.html"
title="下一章"><code class="xref py py-mod docutils literal notranslate"><span class="pre">xmlrpc.server</span></code> --- 基本 XML-RPC 服务器</a></p>
<div role="note" aria-label="source link">
<h3>本页</h3>
<ul class="this-page-menu">
<li><a href="../bugs.html">报告 Bug</a></li>
<li>
<a href="https://github.com/python/cpython/blob/3.8/Doc/library/xmlrpc.client.rst"
rel="nofollow">显示源代码
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>导航</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="总目录"
>索引</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python 模块索引"
>模块</a> |</li>
<li class="right" >
<a href="xmlrpc.server.html" title="xmlrpc.server --- 基本 XML-RPC 服务器"
>下一页</a> |</li>
<li class="right" >
<a href="xmlrpc.html" title="xmlrpc --- XMLRPC 服务端与客户端模块"
>上一页</a> |</li>
<li><img src="../_static/py.svg" alt="python logo" style="vertical-align: middle; margin-top: -1px"/></li>
<li><a href="https://www.python.org/">Python</a> &#187;</li>
<li class="switchers">
<div class="language_switcher_placeholder"></div>
<div class="version_switcher_placeholder"></div>
</li>
<li>
</li>
<li id="cpython-language-and-version">
<a href="../index.html">3.8.20 Documentation</a> &#187;
</li>
<li class="nav-item nav-item-1"><a href="index.html" >Python 标准库</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="internet.html" >互联网协议和支持</a> &#187;</li>
<li class="right">
<div class="inline-search" role="search">
<form class="inline-search" action="../search.html" method="get">
<input placeholder="快速搜索" aria-label="快速搜索" type="text" name="q" />
<input type="submit" value="转向" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
|
</li>
</ul>
</div>
<div class="footer">
&copy; <a href="../copyright.html">版权所有</a> 2001-2024, Python Software Foundation.
<br />
This page is licensed under the Python Software Foundation License Version 2.
<br />
Examples, recipes, and other code in the documentation are additionally licensed under the Zero Clause BSD License.
<br />
<br />
The Python Software Foundation is a non-profit corporation.
<a href="https://www.python.org/psf/donations/">Please donate.</a>
<br />
<br />
最后更新于 12月 09, 2024.
<a href="https://docs.python.org/3/bugs.html">Found a bug</a>?
<br />
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 2.4.4.
</div>
</body>
</html>