12.11 xmlrpc.server:一个XML-RPC服务器
xmlrpc.server模块包含一些类,可以使用XML-RPC协议创建跨平台、语言独立的服务器。除了Python之外,还有很多其他语言的客户库,这使得XML-RPC成为构建RPC式服务的一个很好的选择。
这里提供的所有例子还包含一个与演示服务器交互的客户模块。要运行这些例子,需要两个单独的shell窗口,一个运行服务器,以及另一个运行客户。
12.11.1 一个简单的服务器
这个简单的服务器示例提供了一个函数,该函数取一个字典的名,返回这个字典的内容。第一步是创建SimpleXMLRPCServer实例,告诉它在哪里监听到来的请求(这里要要在Localhost的端口9000监听)。然后定义一个函数作为服务的一部分,注册这个函数,使服务器知道如何调用该函数。最后一步是将这个服务器放在一个接收和响应请求的无限循环中。
警告:这个实现存在明显的安全隐患。如果服务器位于开放的互联网中或在安全问题可能导致严重后果的环境中,那么不要在这样的服务器上运行这个实现。
from xmlrpc.server import SimpleXMLRPCServer
import logging
import os
# Set up logging.
logging.basicConfig(level=logging.INFO)
server = SimpleXMLRPCServer(
('localhost',9000),
logRequests=True,
)
# Expose a function.
def list_contents(dir_name):
logging.info('list_contents(%s)',dir_name)
return os.listdir(dir_name)
server.register_function(list_contents)
# Start the server.
try:
print('Use Control-C to exit')
server.serve_forever()
except KeyboardInterrupt:
print('Exiting')
通过使用xmlrpc.client,可以在URL http://localhost:9000处访问这个服务器。以下代码清单中的客户代码展示了如何从Python调用list_contents()服务。
import xmlrpc.client
proxy = xmlrpc.client.ServerProxy('http://localhost:9000')
print(proxy.list_contents('/tmp'))
ServerProxy使用基URL连接到服务器,然后在代理上直接调用方法。代理上调用的各个方法会被转换为对服务器的请求。参数使用XML格式化,然后通过一个POST消息发送到服务器。服务器解包XML,根据从客户调用的方法名来确定调用哪个函数。参数将被传递到这个函数,返回值转换回XML以便返回给客户。启动服务器会得到以下输出。
在第二个窗口运行客户,会显示/tmp目录的内容。
完成这个请求之后,日志输出会出现在服务器窗口。
输出的第一行来自list_contents()中的logging.info()调用。第二行来自记录请求的服务器,因为logRequests为True。