SimpleXMLRPCServer

注意

SimpleXMLRPCServer模块已被合并到Python 3中。当将源代码转换为Python 3时xmlrpc.server2to3工具将自动适应导入。

2.2版本中的新功能。

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

class SimpleXMLRPCServer.SimpleXMLRPCServer(addr[, requestHandler[, logRequests[, allow_none[, encoding[, bind_and_activate]]]])

创建一个新的服务器实例。该类提供了可以由XML-RPC协议调用的函数注册方法。所述requestHandler参数应至少为请求处理程序实例的工厂; 它默认为SimpleXMLRPCRequestHandler。该地址requestHandler参数传递给SocketServer.TCPServer构造函数。如果logRequests为true(缺省值),则会记录请求; 将此参数设置为false将关闭日志记录。该ALLOW_NONE编码参数传递到xmlrpclib并控制从服务器返回的XML-RPC响应。该bind_and_activate参数控制是否server_bind()server_activate()由构造函数立即调用; 它默认为true。将其设置为false允许代码在绑定地址之前操作allow_reuse_address类变量。

在版本2.5中进行了更改:添加了allow_none编码参数。

在版本2.6中更改:添加了bind_and_activate参数。

class SimpleXMLRPCServer.CGIXMLRPCRequestHandler([allow_none[, encoding]])

创建一个新的实例来处理CGI环境中的XML-RPC请求。该ALLOW_NONE编码参数传递到xmlrpclib并控制从服务器返回的XML-RPC响应。

2.3版本的新功能。

在版本2.5中进行了更改:添加了allow_none编码参数。

class SimpleXMLRPCServer.SimpleXMLRPCRequestHandler

创建一个新的请求处理器实例。此请求处理程序支持POST请求并修改日志记录,以便遵守SimpleXMLRPCServer构造函数参数的logRequests参数。

1. SimpleXMLRPCServer对象

SimpleXMLRPCServer基于类SocketServer.TCPServer,并提供创建简单的手段,独立的XML-RPC服务器。

SimpleXMLRPCServer.register_function(function[, name])

注册一个可以响应XML-RPC请求的函数。如果给出名称,它将是与函数关联的方法名称,否则function.__name__将被使用。名称可以是普通字符串或Unicode字符串,也可以包含Python标识符中不合法的字符,包括句点字符。

SimpleXMLRPCServer.register_instance(instance[, allow_dotted_names])

注册一个用来暴露尚未使用的方法名称的对象register_function()。如果实例包含_dispatch()方法,则使用请求的方法名称和请求中的参数调用它。它的API是def _dispatch(self, method, params)(注意params不代表可变参数列表)。如果它调用一个底层函数来执行它的任务,那么这个函数被称为func(*params)扩展参数列表。_dispatch()作为结果,返回值将返回给客户端。如果实例没有_dispatch()方法,则会搜索与请求的方法的名称匹配的属性。

如果可选的allow_dotted_names参数为true并且该实例没有_dispatch()方法,那么如果请求的方法名称包含句点,则会单独搜索方法名称的每个组件,结果会执行简单的分层搜索。然后使用请求中的参数调用此搜索中找到的值,并将返回值传回客户端。

警告

启用allow_dotted_names选项允许入侵者访问您的模块的全局变量,并可能允许入侵者在您的机器上执行任意代码。只能在安全的封闭网络上使用此选项。

在版本2.3.5中更改:2.4.1 allow_dotted_names被添加到插入安全漏洞; 以前的版本是不安全的。

SimpleXMLRPCServer.register_introspection_functions()

注册XML-RPC内省功能system.listMethodssystem.methodHelpsystem.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版本的新功能。

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

2. CGIXMLRPCRequestHandler

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

CGIXMLRPCRequestHandler.register_function(function[, name])

注册一个可以响应XML-RPC请求的函数。如果给出名称,它将是与函数关联的方法名称,否则将使用 _function .__ name__ 。_name可以是普通字符串或Unicode字符串,也可以包含Python标识符中不合法的字符,包括句点字符。

CGIXMLRPCRequestHandler.register_instance(instance)

注册一个用来暴露尚未使用的方法名称的对象register_function()。如果实例包含_dispatch()方法,则使用请求的方法名称和请求中的参数调用该方法; 返回值作为结果返回给客户端。如果实例没有_dispatch()方法,则会搜索与请求方法的名称匹配的属性; 如果请求的方法名称包含句点,则会单独搜索方法名称的每个组件,从而执行简单的分层搜索。然后使用请求中的参数调用此搜索中找到的值,并将返回值传回客户端。

CGIXMLRPCRequestHandler.register_introspection_functions()

注册XML-RPC内省功能system.listMethodssystem.methodHelpsystem.methodSignature

CGIXMLRPCRequestHandler.register_multicall_functions()

注册XML-RPC multicall函数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()

扫码关注云+社区

领取腾讯云代金券