mirror of
https://github.com/fofolee/uTools-Manuals.git
synced 2025-06-08 15:04:05 +08:00
93 lines
39 KiB
HTML
93 lines
39 KiB
HTML
<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">_dispatch(self,</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> |