20.24. SimpleXMLRPCServer — 基本 XML-RPC 服务器 — Python 文档

来自菜鸟教程
Python/docs/2.7/library/simplexmlrpcserver
跳转至:导航、​搜索

20.24. 简单XMLRPC服务器 — 基本的 XML-RPC 服务器

笔记

SimpleXMLRPCServer 模块已合并到 Python 3 中的 xmlrpc.server2to3 工具将在将您的源代码转换为 Python 3 时自动调整导入。


2.2 版中的新功能。


源代码: :source:`Lib/SimpleXMLRPCServer.py`



SimpleXMLRPCServer 模块为用 Python 编写的 XML-RPC 服务器提供了一个基本的服务器框架。 服务器可以是独立的,使用 SimpleXMLRPCServer,或者嵌入在 CGI 环境中,使用 CGIXMLRPCRequestHandler

class SimpleXMLRPCServer.SimpleXMLRPCServer(addr[, requestHandler[, logRequests[, allow_none[, encoding[, bind_and_activate]]]])

创建一个新的服务器实例。 此类提供注册可被 XML-RPC 协议调用的函数的方法。 requestHandler 参数应该是请求处理程序实例的工厂; 它默认为 SimpleXMLRPCRequestHandleraddrrequestHandler 参数传递给 SocketServer.TCPServer 构造函数。 如果 logRequests 为真(默认),请求将被记录; 将此参数设置为 false 将关闭日志记录。 allow_noneencoding 参数传递给 xmlrpclib 并控制将从服务器返回的 XML-RPC 响应。 bind_and_activate参数控制server_bind()server_activate()是否被构造函数立即调用; 它默认为真。 将其设置为 false 允许代码在绑定地址之前操作 allow_reuse_address 类变量。

2.5 版更改: 添加了 allow_noneencoding 参数。

2.6 版更改: 添加了 bind_and_activate 参数。

class SimpleXMLRPCServer.CGIXMLRPCRequestHandler([allow_none[, encoding]])

创建一个新实例来处理 CGI 环境中的 XML-RPC 请求。 allow_noneencoding 参数传递给 xmlrpclib 并控制将从服务器返回的 XML-RPC 响应。

2.3 版中的新功能。

2.5 版更改: 添加了 allow_noneencoding 参数。

class SimpleXMLRPCServer.SimpleXMLRPCRequestHandler
创建一个新的请求处理程序实例。 此请求处理程序支持 [X30X] 请求并修改日志记录,以便支持 SimpleXMLRPCServer 构造函数参数的 logRequests 参数。

20.24.1。 SimpleXMLRPCServer 对象

SimpleXMLRPCServer 类基于 SocketServer.TCPServer,提供了一种创建简单、独立的 XML-RPC 服务器的方法。

SimpleXMLRPCServer.register_function(function[, name])
注册一个可以响应 XML-RPC 请求的函数。 如果给出 name,它将是与 function 关联的方法名称,否则将使用 function.__name__name 可以是普通字符串或 Unicode 字符串,并且可能包含 Python 标识符中不合法的字符,包括句点字符。
SimpleXMLRPCServer.register_instance(instance[, allow_dotted_names])

注册一个对象,该对象用于公开尚未使用 register_function() 注册的方法名称。 如果 instance 包含 _dispatch() 方法,则使用请求的方法名称和请求中的参数调用该方法。 它的 API 是 def _dispatch(self, method, params)(注意 params 不代表可变参数列表)。 如果它调用底层函数来执行其任务,则该函数被称为 func(*params),从而扩展参数列表。 _dispatch() 的返回值作为结果返回给客户端。 如果 instance 没有 _dispatch() 方法,则搜索与请求的方法名称匹配的属性。

如果可选的 allow_dotted_names 参数为真,并且实例没有 _dispatch() 方法,那么如果请求的方法名称包含句点,则单独搜索方法名称的每个组成部分,使用执行简单的分层搜索的效果。 然后使用请求中的参数调用从该搜索中找到的值,并将返回值传递回客户端。

警告

启用 allow_dotted_names 选项允许入侵者访问您模块的全局变量,并可能允许入侵者在您的机器上执行任意代码。 仅在安全、封闭的网络上使用此选项。

2.3.5 版本变更,: 2.4.1 allow_dotted_names 增加了一个安全漏洞; 以前的版本是不安全的。

SimpleXMLRPCServer.register_introspection_functions()

注册 XML-RPC 内省函数 system.listMethodssystem.methodHelpsystem.methodSignature

2.3 版中的新功能。

SimpleXMLRPCServer.register_multicall_functions()
注册 XML-RPC 多调用函数 system.multicall。
SimpleXMLRPCRequestHandler.rpc_paths

一个属性值,它必须是一个元组,列出用于接收 XML-RPC 请求的 URL 的有效路径部分。 发布到其他路径的请求将导致 404“无此类页面”HTTP 错误。 如果此元组为空,则所有路径都将被视为有效。 默认值为 ('/', '/RPC2')

2.5 版中的新功能。

SimpleXMLRPCRequestHandler.encode_threshold

如果此属性不是 None,如果客户端允许,大于此值的响应将使用 gzip 传输编码进行编码。 默认值为 1400,大致对应于单个 TCP 数据包。

2.7 版中的新功能。

20.24.1.1。 SimpleXMLRPCServer 示例

服务器代码:

from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler

# Restrict to a particular path.
class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)

# Create server
server = SimpleXMLRPCServer(("localhost", 8000),
                            requestHandler=RequestHandler)
server.register_introspection_functions()

# Register pow() function; this will use the value of
# pow.__name__ as the name, which is just 'pow'.
server.register_function(pow)

# Register a function under a different name
def adder_function(x,y):
    return x + y
server.register_function(adder_function, 'add')

# Register an instance; all the methods of the instance are
# published as XML-RPC methods (in this case, just 'div').
class MyFuncs:
    def div(self, x, y):
        return x // y

server.register_instance(MyFuncs())

# Run the server's main loop
server.serve_forever()

以下客户端代码将调用由前面的服务器提供的方法:

import xmlrpclib

s = xmlrpclib.ServerProxy('http://localhost:8000')
print s.pow(2,3)  # Returns 2**3 = 8
print s.add(2,3)  # Returns 5
print s.div(5,2)  # Returns 5//2 = 2

# Print list of available methods
print s.system.listMethods()

以下 SimpleXMLRPCServer 示例包含在 Lib/SimpleXMLRPCServer.py 模块中:

server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(pow)
server.register_function(lambda x,y: x+y, 'add')
server.register_multicall_functions()
server.serve_forever()

这个演示服务器可以从命令行运行:

python -m SimpleXMLRPCServer

Lib/xmlrpclib.py 包含与上述服务器通信的示例客户端代码:

server = ServerProxy("http://localhost:8000")
print server
multi = MultiCall(server)
multi.pow(2, 9)
multi.add(5, 1)
multi.add(24, 11)
try:
    for response in multi():
        print response
except Error, v:
    print "ERROR", v

并且可以使用以下命令直接调用客户端:

python -m xmlrpclib

20.24.2. CGIXMLRPCRequestHandler

CGIXMLRPCRequestHandler 类可用于处理发送到 Python CGI 脚本的 XML-RPC 请求。

CGIXMLRPCRequestHandler.register_function(function[, name])
注册一个可以响应 XML-RPC 请求的函数。 如果给出 name,它将是与函数关联的方法名称,否则将使用 function.__name__name 可以是普通字符串或 Unicode 字符串,并且可能包含 Python 标识符中不合法的字符,包括句点字符。
CGIXMLRPCRequestHandler.register_instance(instance)
注册一个对象,该对象用于公开尚未使用 register_function() 注册的方法名称。 如果实例包含 _dispatch() 方法,则使用请求的方法名称和请求中的参数调用它; 返回值作为结果返回给客户端。 如果实例没有 _dispatch() 方法,则搜索与请求的方法名称匹配的属性; 如果请求的方法名称包含句点,则单独搜索方法名称的每个组成部分,结果是执行简单的分层搜索。 然后使用请求中的参数调用从该搜索中找到的值,并将返回值传递回客户端。
CGIXMLRPCRequestHandler.register_introspection_functions()
注册 XML-RPC 内省函数 system.listMethodssystem.methodHelpsystem.methodSignature
CGIXMLRPCRequestHandler.register_multicall_functions()
注册 XML-RPC 多调用函数 system.multicall
CGIXMLRPCRequestHandler.handle_request([request_text = None])
处理 XML-RPC 请求。 如果给出request_text,则应该是HTTP服务器提供的POST数据,否则会使用stdin的内容。

例子:

class MyFuncs:
    def div(self, x, y): return x // y


handler = CGIXMLRPCRequestHandler()
handler.register_function(pow)
handler.register_function(lambda x,y: x+y, 'add')
handler.register_introspection_functions()
handler.register_instance(MyFuncs())
handler.handle_request()