20.24. SimpleXMLRPCServer — 基本 XML-RPC 服务器 — Python 文档
20.24. 简单XMLRPC服务器 — 基本的 XML-RPC 服务器
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 参数应该是请求处理程序实例的工厂; 它默认为 SimpleXMLRPCRequestHandler。 addr 和 requestHandler 参数传递给 SocketServer.TCPServer 构造函数。 如果 logRequests 为真(默认),请求将被记录; 将此参数设置为 false 将关闭日志记录。 allow_none 和 encoding 参数传递给 xmlrpclib 并控制将从服务器返回的 XML-RPC 响应。 bind_and_activate参数控制
server_bind()
和server_activate()
是否被构造函数立即调用; 它默认为真。 将其设置为 false 允许代码在绑定地址之前操作 allow_reuse_address 类变量。2.5 版更改: 添加了 allow_none 和 encoding 参数。
2.6 版更改: 添加了 bind_and_activate 参数。
- class SimpleXMLRPCServer.CGIXMLRPCRequestHandler([allow_none[, encoding]])
创建一个新实例来处理 CGI 环境中的 XML-RPC 请求。 allow_none 和 encoding 参数传递给 xmlrpclib 并控制将从服务器返回的 XML-RPC 响应。
2.3 版中的新功能。
2.5 版更改: 添加了 allow_none 和 encoding 参数。
- 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.listMethods
、system.methodHelp
和system.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.listMethods
、system.methodHelp
和system.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()