让我们按照以下代码定义一个简单的xmlrpc服务器:
from SimpleXMLRPCServer import SimpleXMLRPCServer
def add(x,y):
return x+y
server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(add, 'addthem')
server.register_function(add, 'add.numbers')
server.register_function(add, 'sum.two.numbers')
server.serve_forever()
您可以通过
连接import xmlrpclib
dev = xmlrpclib.ServerProxy("http://localhost:8000/RPC2")
使用dev
对象,您可以在服务器中访问(为简单起见相同)函数add
,例如
print dev.addthem(1,2)
print dev.add.numbers(1,2)
print dev.sum.two.numbers(1,2)
我的问题:这些电话有哪些部分?什么是dev
(我想是xmlrpclib.ServerProxy
的一个实例),sum
中的dev.sum
是什么(一个函数?一个可调用的?一个类?一个实例?)。 two
中的dev.sum.two
是什么......
例如,以下语法
print dev.add
导致错误
xmlrpclib.Fault: <Fault 1: '<type \'exceptions.Exception\'>:method "add.__str__" is not supported'>
不应该总是打印一些东西吗?什么是 dev.add
和其他部分?
答案 0 :(得分:1)
为了“记录”请求,您可以(例如)在您的客户端中实现自定义传输。
来自doc(改编):
import xmlrpclib, httplib, gzip
class LogTransport(xmlrpclib.Transport):
def send_request(self, connection, handler, request_body):
# log here.
print handler, request_body
if (self.accept_gzip_encoding and gzip):
connection.putrequest("POST", handler, skip_accept_encoding=True)
connection.putheader("Accept-Encoding", "gzip")
else:
connection.putrequest("POST", handler)
p = LogTransport()
server = xmlrpclib.Server('http://time.xmlrpc.com/RPC2', transport=p)
print server.currentTime.getCurrentTime()
输出:
/RPC2 <?xml version='1.0'?>
<methodCall>
<methodName>currentTime.getCurrentTime</methodName>
<params>
</params>
</methodCall>
和服务器错误(因为它不存在)
答案 1 :(得分:0)
在这种情况下,sum.two.numbers
只是在服务器上调用的函数。在这一行server.register_function(add, 'sum.two.numbers')
上,您将该方法设置为映射到带有2个参数的add
函数。您的所有服务器可用方法都映射为当前添加。 dev.add
只是告诉客户端在服务器上运行方法add
。因为您没有将add
映射到服务器上的实际函数,所以不能使用它并且会抛出错误。
查看this example,其中包含自定义SimpleXMLRPCRequestHandler,您可以在其中对其进行自定义以添加日志记录。
如果您仍然遇到日志记录问题,请查看此内容:XML-RPC server logging