12.11.5 公布对象的方法
前面几节讨论了使用好的命名约定和命名空间建立API技术。要在API中结合命名空间,另一种方法是使用类的实例并公布其方法。可以使用只有一个方法的实例重新创建第一个例子。
from xmlrpc.server import SimpleXMLRPCServer
import os
import inspect
server = SimpleXMLRPCServer(
('localhost',9000),
logRequests=True,
)
class DirectoryService:
def list(self,dir_name):
return os.listdir(dir_name)
server.register_instance(DirectoryService())
try:
print('Use Control-C to exit')
server.serve_forever()
except KeyboardInterrupt:
print('Exiting')
客户可以直接调用这个方法。
import xmlrpc.client
proxy = xmlrpc.client.ServerProxy('http://localhost:9000')
print(proxy.list('/tmp'))
输出显示了这个目录的内容。
不过,服务的dir.前缀已丢失。可以定义一个类以便建立一个服务树(可以从客户调用)来恢复。
from xmlrpc.server import SimpleXMLRPCServer
import os
import inspect
server = SimpleXMLRPCServer(
('localhost',9000),
logRequests=True,
)
class ServiceRoot:
pass
class DirectoryService:
def list(self,dir_name):
return os.listdir(dir_name)
root = ServiceRoot()
root.dir = DirectoryService()
server.register_instance(root,allow_dotted_names=True)
try:
print('Use Control-C to exit')
server.serve_forever()
except KeyboardInterrupt:
print('Exiting')
由于注册了ServiceRoot实例,并启用了allow_dotted_names,请求到来时,服务器有权限遍历这个对象树从而使用getattr()查找指定的方法。
import xmlrpc.client
proxy = xmlrpc.client.ServerProxy('http://localhost:9000')
print(proxy.dir.list('/tmp'))
dir.list()的输出与之前实现的输出相同。