uTools-Manuals/docs/python/xmlrpc.server.html
2019-04-21 11:50:48 +08:00

93 lines
39 KiB
HTML
Raw 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.

<div class="body" role="main"><div class="section" id="module-xmlrpc.server"><h1><span class="yiyi-st" id="yiyi-10">21.27. <a class="reference internal" href="#module-xmlrpc.server" title="xmlrpc.server: Basic XML-RPC server implementations."><code class="xref py py-mod docutils literal"><span class="pre">xmlrpc.server</span></code></a> - 基本XML-RPC服务器</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/xmlrpc/server.py">Lib / xmlrpc / server.py</a></span></p><p><span class="yiyi-st" id="yiyi-12"><a class="reference internal" href="#module-xmlrpc.server" title="xmlrpc.server: Basic XML-RPC server implementations."><code class="xref py py-mod docutils literal"><span class="pre">xmlrpc.server</span></code></a>模块为使用Python编写的XML-RPC服务器提供了一个基本的服务器框架。</span><span class="yiyi-st" id="yiyi-13">服务器可以使用<a class="reference internal" href="#xmlrpc.server.SimpleXMLRPCServer" title="xmlrpc.server.SimpleXMLRPCServer"><code class="xref py py-class docutils literal"><span class="pre">SimpleXMLRPCServer</span></code></a>独立运行,也可以使用<a class="reference internal" href="#xmlrpc.server.CGIXMLRPCRequestHandler" title="xmlrpc.server.CGIXMLRPCRequestHandler"><code class="xref py py-class docutils literal"><span class="pre">CGIXMLRPCRequestHandler</span></code></a>嵌入CGI环境中。</span></p><div class="admonition warning"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-14">警告</span></p><p class="last"><span class="yiyi-st" id="yiyi-15"><a class="reference internal" href="#module-xmlrpc.server" title="xmlrpc.server: Basic XML-RPC server implementations."><code class="xref py py-mod docutils literal"><span class="pre">xmlrpc.server</span></code></a>模块对于恶意构造的数据不安全。</span><span class="yiyi-st" id="yiyi-16">如果需要解析不受信任或未经身份验证的数据,请参阅<a class="reference internal" href="xml.html#xml-vulnerabilities"><span>XML vulnerabilities</span></a></span></p></div><dl class="class"><dt id="xmlrpc.server.SimpleXMLRPCServer"><span class="yiyi-st" id="yiyi-17"> <em class="property">class </em><code class="descclassname">xmlrpc.server.</code><code class="descname">SimpleXMLRPCServer</code><span class="sig-paren">(</span><em>addr</em>, <em>requestHandler=SimpleXMLRPCRequestHandler</em>, <em>logRequests=True</em>, <em>allow_none=False</em>, <em>encoding=None</em>, <em>bind_and_activate=True</em>, <em>use_builtin_types=False</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-18">创建新服务器实例。</span><span class="yiyi-st" id="yiyi-19">此类提供了可以由XML-RPC协议调用的函数的注册方法。</span><span class="yiyi-st" id="yiyi-20"><em>requestHandler</em>参数应该是请求处理程序实例的工厂;它默认为<a class="reference internal" href="#xmlrpc.server.SimpleXMLRPCRequestHandler" title="xmlrpc.server.SimpleXMLRPCRequestHandler"><code class="xref py py-class docutils literal"><span class="pre">SimpleXMLRPCRequestHandler</span></code></a></span><span class="yiyi-st" id="yiyi-21"><em>addr</em><em>requestHandler</em>参数传递给<a class="reference internal" href="socketserver.html#socketserver.TCPServer" title="socketserver.TCPServer"><code class="xref py py-class docutils literal"><span class="pre">socketserver.TCPServer</span></code></a>构造函数。</span><span class="yiyi-st" id="yiyi-22">如果<em>logRequests</em>为true默认值则会记录请求将此参数设置为false将关闭日志记录。</span><span class="yiyi-st" id="yiyi-23"><em>allow_none</em><em>编码</em>参数传递到<a class="reference internal" href="xmlrpc.client.html#module-xmlrpc.client" title="xmlrpc.client: XML-RPC client access."><code class="xref py py-mod docutils literal"><span class="pre">xmlrpc.client</span></code></a>并控制将从服务器返回的XML-RPC响应。</span><span class="yiyi-st" id="yiyi-24"><em>bind_and_activate</em>参数控制是否由构造函数立即调用<code class="xref py py-meth docutils literal"><span class="pre">server_bind()</span></code><code class="xref py py-meth docutils literal"><span class="pre">server_activate()</span></code></span><span class="yiyi-st" id="yiyi-25">将其设置为false允许代码在绑定地址之前操作<em>allow_reuse_address</em>类变量。</span><span class="yiyi-st" id="yiyi-26"><em>use_builtin_types</em>参数传递到<a class="reference internal" href="xmlrpc.client.html#xmlrpc.client.loads" title="xmlrpc.client.loads"><code class="xref py py-func docutils literal"><span class="pre">loads()</span></code></a>函数,并控制在接收到日期/时间值或二进制数据时处理的类型它默认为false。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-27"><span class="versionmodified">在版本3.3中已更改:</span>添加了<em>use_builtin_types</em>标志。</span></p></div></dd></dl><dl class="class"><dt id="xmlrpc.server.CGIXMLRPCRequestHandler"><span class="yiyi-st" id="yiyi-28"> <em class="property">class </em><code class="descclassname">xmlrpc.server.</code><code class="descname">CGIXMLRPCRequestHandler</code><span class="sig-paren">(</span><em>allow_none=False</em>, <em>encoding=None</em>, <em>use_builtin_types=False</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-29">创建一个新的实例来处理CGI环境中的XML-RPC请求。</span><span class="yiyi-st" id="yiyi-30"><em>allow_none</em><em>编码</em>参数传递到<a class="reference internal" href="xmlrpc.client.html#module-xmlrpc.client" title="xmlrpc.client: XML-RPC client access."><code class="xref py py-mod docutils literal"><span class="pre">xmlrpc.client</span></code></a>并控制将从服务器返回的XML-RPC响应。</span><span class="yiyi-st" id="yiyi-31"><em>use_builtin_types</em>参数传递到<a class="reference internal" href="xmlrpc.client.html#xmlrpc.client.loads" title="xmlrpc.client.loads"><code class="xref py py-func docutils literal"><span class="pre">loads()</span></code></a>函数,并控制在接收到日期/时间值或二进制数据时处理的类型它默认为false。</span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-32"><span class="versionmodified">在版本3.3中已更改:</span>添加了<em>use_builtin_types</em>标志。</span></p></div></dd></dl><dl class="class"><dt id="xmlrpc.server.SimpleXMLRPCRequestHandler"><span class="yiyi-st" id="yiyi-33"> <em class="property">class </em><code class="descclassname">xmlrpc.server.</code><code class="descname">SimpleXMLRPCRequestHandler</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-34">创建一个新的请求处理程序实例。</span><span class="yiyi-st" id="yiyi-35">此请求处理程序支持<code class="docutils literal"><span class="pre">POST</span></code>请求并修改日志记录,以便将<em>logRequests</em>参数指向<a class="reference internal" href="#xmlrpc.server.SimpleXMLRPCServer" title="xmlrpc.server.SimpleXMLRPCServer"><code class="xref py py-class docutils literal"><span class="pre">SimpleXMLRPCServer</span></code></a>构造函数参数。</span></p></dd></dl><div class="section" id="simplexmlrpcserver-objects"><h2><span class="yiyi-st" id="yiyi-36">21.27.1. </span><span class="yiyi-st" id="yiyi-37">SimpleXMLRPCServer Objects</span></h2><p><span class="yiyi-st" id="yiyi-38"><a class="reference internal" href="#xmlrpc.server.SimpleXMLRPCServer" title="xmlrpc.server.SimpleXMLRPCServer"><code class="xref py py-class docutils literal"><span class="pre">SimpleXMLRPCServer</span></code></a>类基于<a class="reference internal" href="socketserver.html#socketserver.TCPServer" title="socketserver.TCPServer"><code class="xref py py-class docutils literal"><span class="pre">socketserver.TCPServer</span></code></a>并提供了创建简单的独立XML-RPC服务器的方法。</span></p><dl class="method"><dt id="xmlrpc.server.SimpleXMLRPCServer.register_function"><span class="yiyi-st" id="yiyi-39"> <code class="descclassname">SimpleXMLRPCServer.</code><code class="descname">register_function</code><span class="sig-paren">(</span><em>function</em>, <em>name=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-40">注册可以响应XML-RPC请求的函数。</span><span class="yiyi-st" id="yiyi-41">如果给定<em>name</em>,则将是与<em>函数</em>相关联的方法名称,否则将使用<code class="docutils literal"><span class="pre">function.__name__</span></code></span><span class="yiyi-st" id="yiyi-42"><em>名称</em>可以是正常字符串或Unicode字符串并且可能包含Python标识符中不合法的字符包括句点字符。</span></p></dd></dl><dl class="method"><dt id="xmlrpc.server.SimpleXMLRPCServer.register_instance"><span class="yiyi-st" id="yiyi-43"> <code class="descclassname">SimpleXMLRPCServer.</code><code class="descname">register_instance</code><span class="sig-paren">(</span><em>instance</em>, <em>allow_dotted_names=False</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-44">注册用于公开未使用<a class="reference internal" href="#xmlrpc.server.SimpleXMLRPCServer.register_function" title="xmlrpc.server.SimpleXMLRPCServer.register_function"><code class="xref py py-meth docutils literal"><span class="pre">register_function()</span></code></a>注册的方法名称的对象。</span><span class="yiyi-st" id="yiyi-45">如果<em>实例</em>包含<code class="xref py py-meth docutils literal"><span class="pre">_dispatch()</span></code>方法,则使用请求的方法名称和请求中的参数调用它。</span><span class="yiyi-st" id="yiyi-46">其API为<code class="docutils literal"><span class="pre">def</span> <span class="pre">_dispatchself</span> <span class="pre">方法,</span> <span class="pre">params</span></code> <em>params</em>不表示可变参数列表)。</span><span class="yiyi-st" id="yiyi-47">如果它调用一个底层函数来执行它的任务,该函数被称为<code class="docutils literal"><span class="pre">func(*params)</span></code>,扩展参数列表。</span><span class="yiyi-st" id="yiyi-48">来自<code class="xref py py-meth docutils literal"><span class="pre">_dispatch()</span></code>的返回值作为结果返回到客户端。</span><span class="yiyi-st" id="yiyi-49">如果<em>实例</em>没有<code class="xref py py-meth docutils literal"><span class="pre">_dispatch()</span></code>方法,则搜索与所请求方法的名称匹配的属性。</span></p><p><span class="yiyi-st" id="yiyi-50">如果可选的<em>allow_dotted_names</em>参数为真,且实例没有<code class="xref py py-meth docutils literal"><span class="pre">_dispatch()</span></code>方法,则如果请求的方法名称包含句点,则搜索方法名称的每个组件单独地,具有执行简单的分层搜索的效果。</span><span class="yiyi-st" id="yiyi-51">然后使用来自请求的参数调用从此搜索中找到的值,并将返回值传递回客户端。</span></p><div class="admonition warning"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-52">警告</span></p><p class="last"><span class="yiyi-st" id="yiyi-53">启用<em>allow_dotted_names</em>选项允许入侵者访问您模块的全局变量,并允许入侵者在您的机器上执行任意代码。</span><span class="yiyi-st" id="yiyi-54">仅在安全,封闭的网络上使用此选项。</span></p></div></dd></dl><dl class="method"><dt id="xmlrpc.server.SimpleXMLRPCServer.register_introspection_functions"><span class="yiyi-st" id="yiyi-55"> <code class="descclassname">SimpleXMLRPCServer.</code><code class="descname">register_introspection_functions</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-56">注册XML-RPC内省函数<code class="docutils literal"><span class="pre">system.listMethods</span></code><code class="docutils literal"><span class="pre">system.methodHelp</span></code><code class="docutils literal"><span class="pre">system.methodSignature</span></code></span></p></dd></dl><dl class="method"><dt id="xmlrpc.server.SimpleXMLRPCServer.register_multicall_functions"><span class="yiyi-st" id="yiyi-57"> <code class="descclassname">SimpleXMLRPCServer.</code><code class="descname">register_multicall_functions</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-58">注册XML-RPC多元函数system.multicall。</span></p></dd></dl><dl class="attribute"><dt id="xmlrpc.server.SimpleXMLRPCRequestHandler.rpc_paths"><span class="yiyi-st" id="yiyi-59"> <code class="descclassname">SimpleXMLRPCRequestHandler.</code><code class="descname">rpc_paths</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-60">属性值必须是列出用于接收XML-RPC请求的URL的有效路径部分的元组。</span><span class="yiyi-st" id="yiyi-61">发布到其他路径的请求将导致404“无此类网页”HTTP错误。</span><span class="yiyi-st" id="yiyi-62">如果此元组为空,所有路径将被视为有效。</span><span class="yiyi-st" id="yiyi-63">默认值为<code class="docutils literal"><span class="pre">'/'</span> <span class="pre">'/ RPC2'</span></code></span></p></dd></dl><div class="section" id="simplexmlrpcserver-example"><h3><span class="yiyi-st" id="yiyi-64">21.27.1.1. </span><span class="yiyi-st" id="yiyi-65">SimpleXMLRPCServer Example</span></h3><p><span class="yiyi-st" id="yiyi-66">服务器代码:</span></p><pre><code class="language-python"><span></span><span class="kn">from</span> <span class="nn">xmlrpc.server</span> <span class="k">import</span> <span class="n">SimpleXMLRPCServer</span>
<span class="kn">from</span> <span class="nn">xmlrpc.server</span> <span class="k">import</span> <span class="n">SimpleXMLRPCRequestHandler</span>
<span class="c1"># Restrict to a particular path.</span>
<span class="k">class</span> <span class="nc">RequestHandler</span><span class="p">(</span><span class="n">SimpleXMLRPCRequestHandler</span><span class="p">):</span>
<span class="n">rpc_paths</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'/RPC2'</span><span class="p">,)</span>
<span class="c1"># Create server</span>
<span class="n">server</span> <span class="o">=</span> <span class="n">SimpleXMLRPCServer</span><span class="p">((</span><span class="s2">"localhost"</span><span class="p">,</span> <span class="mi">8000</span><span class="p">),</span>
<span class="n">requestHandler</span><span class="o">=</span><span class="n">RequestHandler</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">register_introspection_functions</span><span class="p">()</span>
<span class="c1"># Register pow() function; this will use the value of</span>
<span class="c1"># pow.__name__ as the name, which is just 'pow'.</span>
<span class="n">server</span><span class="o">.</span><span class="n">register_function</span><span class="p">(</span><span class="nb">pow</span><span class="p">)</span>
<span class="c1"># Register a function under a different name</span>
<span class="k">def</span> <span class="nf">adder_function</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="n">server</span><span class="o">.</span><span class="n">register_function</span><span class="p">(</span><span class="n">adder_function</span><span class="p">,</span> <span class="s1">'add'</span><span class="p">)</span>
<span class="c1"># Register an instance; all the methods of the instance are</span>
<span class="c1"># published as XML-RPC methods (in this case, just 'mul').</span>
<span class="k">class</span> <span class="nc">MyFuncs</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">mul</span><span class="p">(</span><span class="bp">self</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="n">server</span><span class="o">.</span><span class="n">register_instance</span><span class="p">(</span><span class="n">MyFuncs</span><span class="p">())</span>
<span class="c1"># Run the server's main loop</span>
<span class="n">server</span><span class="o">.</span><span class="n">serve_forever</span><span class="p">()</span>
</code></pre><p><span class="yiyi-st" id="yiyi-67">以下客户端代码将调用前面的服务器提供的方法:</span></p><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">xmlrpc.client</span>
<span class="n">s</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">'http://localhost:8000'</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">pow</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">))</span> <span class="c1"># Returns 2**3 = 8</span>
<span class="nb">print</span><span class="p">(</span><span class="n">s</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">3</span><span class="p">))</span> <span class="c1"># Returns 5</span>
<span class="nb">print</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">mul</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span><span class="mi">2</span><span class="p">))</span> <span class="c1"># Returns 5*2 = 10</span>
<span class="c1"># Print list of available methods</span>
<span class="nb">print</span><span class="p">(</span><span class="n">s</span><span class="o">.</span><span class="n">system</span><span class="o">.</span><span class="n">listMethods</span><span class="p">())</span>
</code></pre><p><span class="yiyi-st" id="yiyi-68">包含在<code class="file docutils literal"><span class="pre">Lib/xmlrpc/server.py</span></code>模块中的以下示例显示允许点名称和注册多元函数的服务器。</span></p><div class="admonition warning"><p class="first admonition-title"><span class="yiyi-st" id="yiyi-69">警告</span></p><p class="last"><span class="yiyi-st" id="yiyi-70">启用<em>allow_dotted_names</em>选项允许入侵者访问您模块的全局变量,并允许入侵者在您的机器上执行任意代码。</span><span class="yiyi-st" id="yiyi-71">仅在安全,封闭的网络中使用此示例。</span></p></div><pre><code class="language-python"><span></span><span class="kn">import</span> <span class="nn">datetime</span>
<span class="k">class</span> <span class="nc">ExampleService</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">getData</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">'42'</span>
<span class="k">class</span> <span class="nc">currentTime</span><span class="p">:</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">getCurrentTime</span><span class="p">():</span>
<span class="k">return</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</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">"localhost"</span><span class="p">,</span> <span class="mi">8000</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="nb">pow</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="k">lambda</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">:</span> <span class="n">x</span><span class="o">+</span><span class="n">y</span><span class="p">,</span> <span class="s1">'add'</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">register_instance</span><span class="p">(</span><span class="n">ExampleService</span><span class="p">(),</span> <span class="n">allow_dotted_names</span><span class="o">=</span><span class="kc">True</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="nb">print</span><span class="p">(</span><span class="s1">'Serving XML-RPC on localhost port 8000'</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">server</span><span class="o">.</span><span class="n">serve_forever</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">KeyboardInterrupt</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">Keyboard interrupt received, exiting."</span><span class="p">)</span>
<span class="n">server</span><span class="o">.</span><span class="n">server_close</span><span class="p">()</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-72">这个ExampleService演示可以从命令行调用</span></p><pre><code class="language-python"><span></span><span class="n">python</span> <span class="o">-</span><span class="n">m</span> <span class="n">xmlrpc</span><span class="o">.</span><span class="n">server</span>
</code></pre><p><span class="yiyi-st" id="yiyi-73">与上述服务器交互的客户端包含在<cite>Lib / xmlrpc / client.py</cite>中:</span></p><pre><code class="language-python"><span></span><span class="n">server</span> <span class="o">=</span> <span class="n">ServerProxy</span><span class="p">(</span><span class="s2">"http://localhost:8000"</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">server</span><span class="o">.</span><span class="n">currentTime</span><span class="o">.</span><span class="n">getCurrentTime</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">"ERROR"</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="n">multi</span> <span class="o">=</span> <span class="n">MultiCall</span><span class="p">(</span><span class="n">server</span><span class="p">)</span>
<span class="n">multi</span><span class="o">.</span><span class="n">getData</span><span class="p">()</span>
<span class="n">multi</span><span class="o">.</span><span class="n">pow</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="mi">9</span><span class="p">)</span>
<span class="n">multi</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">for</span> <span class="n">response</span> <span class="ow">in</span> <span class="n">multi</span><span class="p">():</span>
<span class="nb">print</span><span class="p">(</span><span class="n">response</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">"ERROR"</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
</code></pre><p><span class="yiyi-st" id="yiyi-74">与演示XMLRPC服务器交互的此客户端可以调用</span></p><pre><code class="language-python"><span></span><span class="n">python</span> <span class="o">-</span><span class="n">m</span> <span class="n">xmlrpc</span><span class="o">.</span><span class="n">client</span>
</code></pre></div></div><div class="section" id="cgixmlrpcrequesthandler"><h2><span class="yiyi-st" id="yiyi-75">21.27.2. </span><span class="yiyi-st" id="yiyi-76">CGIXMLRPCRequestHandler</span></h2><p><span class="yiyi-st" id="yiyi-77"><a class="reference internal" href="#xmlrpc.server.CGIXMLRPCRequestHandler" title="xmlrpc.server.CGIXMLRPCRequestHandler"><code class="xref py py-class docutils literal"><span class="pre">CGIXMLRPCRequestHandler</span></code></a>类可用于处理发送到Python CGI脚本的XML-RPC请求。</span></p><dl class="method"><dt id="xmlrpc.server.CGIXMLRPCRequestHandler.register_function"><span class="yiyi-st" id="yiyi-78"> <code class="descclassname">CGIXMLRPCRequestHandler.</code><code class="descname">register_function</code><span class="sig-paren">(</span><em>function</em>, <em>name=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-79">注册可以响应XML-RPC请求的函数。</span><span class="yiyi-st" id="yiyi-80">如果给定<em>name</em>,它将是与函数关联的方法名,否则将使用<em>函数.__ name __</em></span><span class="yiyi-st" id="yiyi-81"><em>名称</em>可以是正常字符串或Unicode字符串并且可能包含Python标识符中不合法的字符包括句点字符。</span></p></dd></dl><dl class="method"><dt id="xmlrpc.server.CGIXMLRPCRequestHandler.register_instance"><span class="yiyi-st" id="yiyi-82"> <code class="descclassname">CGIXMLRPCRequestHandler.</code><code class="descname">register_instance</code><span class="sig-paren">(</span><em>instance</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-83">注册用于公开未使用<a class="reference internal" href="#xmlrpc.server.CGIXMLRPCRequestHandler.register_function" title="xmlrpc.server.CGIXMLRPCRequestHandler.register_function"><code class="xref py py-meth docutils literal"><span class="pre">register_function()</span></code></a>注册的方法名称的对象。</span><span class="yiyi-st" id="yiyi-84">如果实例包含<code class="xref py py-meth docutils literal"><span class="pre">_dispatch()</span></code>方法,则使用请求的方法名称和请求中的参数调用它;返回值作为结果返回到客户端。</span><span class="yiyi-st" id="yiyi-85">如果实例没有<code class="xref py py-meth docutils literal"><span class="pre">_dispatch()</span></code>方法,则搜索与所请求方法的名称匹配的属性;如果所请求的方法名称包含句点,则单独搜索方法名称的每个组件,其效果是执行简单的分层搜索。</span><span class="yiyi-st" id="yiyi-86">然后使用来自请求的参数调用从此搜索中找到的值,并将返回值传递回客户端。</span></p></dd></dl><dl class="method"><dt id="xmlrpc.server.CGIXMLRPCRequestHandler.register_introspection_functions"><span class="yiyi-st" id="yiyi-87"> <code class="descclassname">CGIXMLRPCRequestHandler.</code><code class="descname">register_introspection_functions</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-88">注册XML-RPC内省功能<code class="docutils literal"><span class="pre">system.listMethods</span></code><code class="docutils literal"><span class="pre">system.methodHelp</span></code><code class="docutils literal"><span class="pre">system.methodSignature</span></code></span></p></dd></dl><dl class="method"><dt id="xmlrpc.server.CGIXMLRPCRequestHandler.register_multicall_functions"><span class="yiyi-st" id="yiyi-89"> <code class="descclassname">CGIXMLRPCRequestHandler.</code><code class="descname">register_multicall_functions</code><span class="sig-paren">(</span><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-90">注册XML-RPC多元函数<code class="docutils literal"><span class="pre">system.multicall</span></code></span></p></dd></dl><dl class="method"><dt id="xmlrpc.server.CGIXMLRPCRequestHandler.handle_request"><span class="yiyi-st" id="yiyi-91"> <code class="descclassname">CGIXMLRPCRequestHandler.</code><code class="descname">handle_request</code><span class="sig-paren">(</span><em>request_text=None</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-92">处理XML-RPC请求。</span><span class="yiyi-st" id="yiyi-93">如果给出<em>request_text</em>它应该是HTTP服务器提供的POST数据否则将使用stdin的内容。</span></p></dd></dl><p><span class="yiyi-st" id="yiyi-94">例:</span></p><pre><code class="language-python"><span></span><span class="k">class</span> <span class="nc">MyFuncs</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">mul</span><span class="p">(</span><span class="bp">self</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="n">handler</span> <span class="o">=</span> <span class="n">CGIXMLRPCRequestHandler</span><span class="p">()</span>
<span class="n">handler</span><span class="o">.</span><span class="n">register_function</span><span class="p">(</span><span class="nb">pow</span><span class="p">)</span>
<span class="n">handler</span><span class="o">.</span><span class="n">register_function</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">,</span><span class="n">y</span><span class="p">:</span> <span class="n">x</span><span class="o">+</span><span class="n">y</span><span class="p">,</span> <span class="s1">'add'</span><span class="p">)</span>
<span class="n">handler</span><span class="o">.</span><span class="n">register_introspection_functions</span><span class="p">()</span>
<span class="n">handler</span><span class="o">.</span><span class="n">register_instance</span><span class="p">(</span><span class="n">MyFuncs</span><span class="p">())</span>
<span class="n">handler</span><span class="o">.</span><span class="n">handle_request</span><span class="p">()</span>
</code></pre></div><div class="section" id="documenting-xmlrpc-server"><h2><span class="yiyi-st" id="yiyi-95">21.27.3. </span><span class="yiyi-st" id="yiyi-96">Documenting XMLRPC server</span></h2><p><span class="yiyi-st" id="yiyi-97">这些类扩展了上述类来响应HTTP GET请求来提供HTML文档。</span><span class="yiyi-st" id="yiyi-98">服务器可以使用<a class="reference internal" href="#xmlrpc.server.DocXMLRPCServer" title="xmlrpc.server.DocXMLRPCServer"><code class="xref py py-class docutils literal"><span class="pre">DocXMLRPCServer</span></code></a>独立运行,也可以使用<a class="reference internal" href="#xmlrpc.server.DocCGIXMLRPCRequestHandler" title="xmlrpc.server.DocCGIXMLRPCRequestHandler"><code class="xref py py-class docutils literal"><span class="pre">DocCGIXMLRPCRequestHandler</span></code></a>嵌入在CGI环境中。</span></p><dl class="class"><dt id="xmlrpc.server.DocXMLRPCServer"><span class="yiyi-st" id="yiyi-99"> <em class="property">class </em><code class="descclassname">xmlrpc.server.</code><code class="descname">DocXMLRPCServer</code><span class="sig-paren">(</span><em>addr</em>, <em>requestHandler=DocXMLRPCRequestHandler</em>, <em>logRequests=True</em>, <em>allow_none=False</em>, <em>encoding=None</em>, <em>bind_and_activate=True</em>, <em>use_builtin_types=True</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-100">创建新服务器实例。</span><span class="yiyi-st" id="yiyi-101">所有参数的含义与<a class="reference internal" href="#xmlrpc.server.SimpleXMLRPCServer" title="xmlrpc.server.SimpleXMLRPCServer"><code class="xref py py-class docutils literal"><span class="pre">SimpleXMLRPCServer</span></code></a>相同; <em>requestHandler</em>默认为<a class="reference internal" href="#xmlrpc.server.DocXMLRPCRequestHandler" title="xmlrpc.server.DocXMLRPCRequestHandler"><code class="xref py py-class docutils literal"><span class="pre">DocXMLRPCRequestHandler</span></code></a></span></p><div class="versionchanged"><p><span class="yiyi-st" id="yiyi-102"><span class="versionmodified">在版本3.3中已更改:</span>添加了<em>use_builtin_types</em>标志。</span></p></div></dd></dl><dl class="class"><dt id="xmlrpc.server.DocCGIXMLRPCRequestHandler"><span class="yiyi-st" id="yiyi-103"> <em class="property">class </em><code class="descclassname">xmlrpc.server.</code><code class="descname">DocCGIXMLRPCRequestHandler</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-104">创建一个新的实例来处理CGI环境中的XML-RPC请求。</span></p></dd></dl><dl class="class"><dt id="xmlrpc.server.DocXMLRPCRequestHandler"><span class="yiyi-st" id="yiyi-105"> <em class="property">class </em><code class="descclassname">xmlrpc.server.</code><code class="descname">DocXMLRPCRequestHandler</code></span></dt><dd><p><span class="yiyi-st" id="yiyi-106">创建一个新的请求处理程序实例。</span><span class="yiyi-st" id="yiyi-107">This request handler supports XML-RPC POST requests, documentation GET requests, and modifies logging so that the <em>logRequests</em> parameter to the <a class="reference internal" href="#xmlrpc.server.DocXMLRPCServer" title="xmlrpc.server.DocXMLRPCServer"><code class="xref py py-class docutils literal"><span class="pre">DocXMLRPCServer</span></code></a> constructor parameter is honored.</span></p></dd></dl></div><div class="section" id="docxmlrpcserver-objects"><h2><span class="yiyi-st" id="yiyi-108">21.27.4. </span><span class="yiyi-st" id="yiyi-109">DocXMLRPCServer Objects</span></h2><p><span class="yiyi-st" id="yiyi-110"><a class="reference internal" href="#xmlrpc.server.DocXMLRPCServer" title="xmlrpc.server.DocXMLRPCServer"><code class="xref py py-class docutils literal"><span class="pre">DocXMLRPCServer</span></code></a>类派生自<a class="reference internal" href="#xmlrpc.server.SimpleXMLRPCServer" title="xmlrpc.server.SimpleXMLRPCServer"><code class="xref py py-class docutils literal"><span class="pre">SimpleXMLRPCServer</span></code></a>并提供了创建自文档独立XML-RPC服务器的方法。</span><span class="yiyi-st" id="yiyi-111">HTTP POST请求作为XML-RPC方法调用处理。</span><span class="yiyi-st" id="yiyi-112">HTTP GET请求通过生成pydoc风格的HTML文档来处理。</span><span class="yiyi-st" id="yiyi-113">这允许服务器提供其自己的基于Web的文档。</span></p><dl class="method"><dt id="xmlrpc.server.DocXMLRPCServer.set_server_title"><span class="yiyi-st" id="yiyi-114"> <code class="descclassname">DocXMLRPCServer.</code><code class="descname">set_server_title</code><span class="sig-paren">(</span><em>server_title</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-115">设置生成的HTML文档中使用的标题。</span><span class="yiyi-st" id="yiyi-116">此标题将在HTML“title”元素中使用。</span></p></dd></dl><dl class="method"><dt id="xmlrpc.server.DocXMLRPCServer.set_server_name"><span class="yiyi-st" id="yiyi-117"> <code class="descclassname">DocXMLRPCServer.</code><code class="descname">set_server_name</code><span class="sig-paren">(</span><em>server_name</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-118">设置生成的HTML文档中使用的名称。</span><span class="yiyi-st" id="yiyi-119">此名称将显示在生成的文档顶部的“h1”元素中。</span></p></dd></dl><dl class="method"><dt id="xmlrpc.server.DocXMLRPCServer.set_server_documentation"><span class="yiyi-st" id="yiyi-120"> <code class="descclassname">DocXMLRPCServer.</code><code class="descname">set_server_documentation</code><span class="sig-paren">(</span><em>server_documentation</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-121">设置生成的HTML文档中使用的描述。</span><span class="yiyi-st" id="yiyi-122">此描述将在文档中显示为服务器名称下面的段落。</span></p></dd></dl></div><div class="section" id="doccgixmlrpcrequesthandler"><h2><span class="yiyi-st" id="yiyi-123">21.27.5. </span><span class="yiyi-st" id="yiyi-124">DocCGIXMLRPCRequestHandler</span></h2><p><span class="yiyi-st" id="yiyi-125"><a class="reference internal" href="#xmlrpc.server.DocCGIXMLRPCRequestHandler" title="xmlrpc.server.DocCGIXMLRPCRequestHandler"><code class="xref py py-class docutils literal"><span class="pre">DocCGIXMLRPCRequestHandler</span></code></a>类派生自<a class="reference internal" href="#xmlrpc.server.CGIXMLRPCRequestHandler" title="xmlrpc.server.CGIXMLRPCRequestHandler"><code class="xref py py-class docutils literal"><span class="pre">CGIXMLRPCRequestHandler</span></code></a>并提供了创建自文档XML-RPC CGI脚本的方法。</span><span class="yiyi-st" id="yiyi-126">HTTP POST请求作为XML-RPC方法调用处理。</span><span class="yiyi-st" id="yiyi-127">HTTP GET请求通过生成pydoc风格的HTML文档来处理。</span><span class="yiyi-st" id="yiyi-128">这允许服务器提供其自己的基于Web的文档。</span></p><dl class="method"><dt id="xmlrpc.server.DocCGIXMLRPCRequestHandler.set_server_title"><span class="yiyi-st" id="yiyi-129"> <code class="descclassname">DocCGIXMLRPCRequestHandler.</code><code class="descname">set_server_title</code><span class="sig-paren">(</span><em>server_title</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-130">设置生成的HTML文档中使用的标题。</span><span class="yiyi-st" id="yiyi-131">此标题将在HTML“title”元素中使用。</span></p></dd></dl><dl class="method"><dt id="xmlrpc.server.DocCGIXMLRPCRequestHandler.set_server_name"><span class="yiyi-st" id="yiyi-132"> <code class="descclassname">DocCGIXMLRPCRequestHandler.</code><code class="descname">set_server_name</code><span class="sig-paren">(</span><em>server_name</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-133">设置生成的HTML文档中使用的名称。</span><span class="yiyi-st" id="yiyi-134">此名称将显示在生成的文档顶部的“h1”元素中。</span></p></dd></dl><dl class="method"><dt id="xmlrpc.server.DocCGIXMLRPCRequestHandler.set_server_documentation"><span class="yiyi-st" id="yiyi-135"> <code class="descclassname">DocCGIXMLRPCRequestHandler.</code><code class="descname">set_server_documentation</code><span class="sig-paren">(</span><em>server_documentation</em><span class="sig-paren">)</span></span></dt><dd><p><span class="yiyi-st" id="yiyi-136">设置生成的HTML文档中使用的描述。</span><span class="yiyi-st" id="yiyi-137">此描述将在文档中显示为服务器名称下面的段落。</span></p></dd></dl></div></div></div>