20.24. SimpleXMLRPCServer —基本的 XML-RPC 服务器

Note

SimpleXMLRPCServer模块已在 Python 3 中合并到xmlrpc.server中。2to3工具在将源转换为 Python 3 时将自动适应导入。

2.2 版中的新Function。

源代码: Lib/SimpleXMLRPCServer.py


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

在版本 2.5 中更改:添加了* allow_none encoding *参数。

在 2.6 版中进行了更改:添加了* bind_and_activate *参数。

2.3 版的新Function。

在版本 2.5 中更改:添加了* allow_none encoding *参数。

20.24.1. SimpleXMLRPCServer 对象

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

如果可选的* allow_dotted_names *参数为 true,并且实例不具有_dispatch()方法,则如果请求的方法名称包含句点,则将分别搜索方法名称的每个组成部分,从而执行简单的分层搜索。然后使用请求中的参数调用从此搜索中找到的值,并将返回值传递回 Client 端。

Warning

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

在版本 2.3.5 中进行了更改:2.4.1 已添加* allow_dotted_names *来填补安全漏洞;以前的版本不安全。

2.3 版的新Function。

2.5 版的新Function。

2.7 版的新Function。

20.24.1.1. SimpleXMLRPCServer 示例

Server code:

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()

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

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

与上述服务器通信的示例 Client 端代码包含在 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

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

python -m xmlrpclib

20.24.2. CGIXMLRPCRequestHandler

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

Example:

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()
首页