xmlrpc.server– 基本的XMLRPC服务器

源代码: Lib / xmlrpc / server.py


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

警告

xmlrpc.server模块不能安全地抵御恶意构建的数据。如果需要解析不受信任或未经身份验证的数据,请参阅 XML漏洞.

class xmlrpc.server.SimpleXMLRPCServeraddr, requestHandler=SimpleXMLRPCRequestHandler, logRequests=True, allow_none=False, encoding=None, bind_and_activate=True, use_builtin_types=False

创建新的服务器实例。此类提供了可由XML-RPC协议调用的注册函数的方法。requestHandler参数应该是请求处理程序实例的工厂;它默认为SimpleXMLRPCRequestHandleraddrrequestHandler参数传递给socketserver.TCPServer构造函数。如果logRequests为真(默认值),将记录请求;将此参数设置为false将关闭日志记录。allow_noneencoding参数被传递给xmlrpc.client并控制将从服务器返回的XML-RPC响应。bind_and_activate参数控制是否server_bind()server_activate()被构造者立即调用;它默认为true。将其设置为false允许代码操纵allow_reuse_address地址绑定前的类变量.use_builtin_types参数传递给loads()函数和控制在接收日期/时间值或二进制数据时处理哪些类型;它默认为false.

更改版本3.3: use_builtin_types标志已添加.

class xmlrpc.server.CGIXMLRPCRequestHandler (allow_none=False, encoding=None, use_builtin_types=False

创建一个新实例以处理CGI环境中的XML-RPC请求。allow_noneencoding参数传递给xmlrpc.client并控制将从服务器返回的XML-RPC响应.use_builtin_types参数传递给loads()函数和控制在接收日期/时间值或二进制数据时处理哪些类型;它默认为false.

更改版本3.3: use_builtin_types标志已添加.

class xmlrpc.server.SimpleXMLRPCRequestHandler

创建新的请求处理程序实例。此请求处理程序支持POST请求并修改日志记录,以便logRequests构造函数参数的SimpleXMLRPCServer参数得到兑现.

SimpleXMLRPCServer对象

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

SimpleXMLRPCServer.register_functionfunction=None, name=None

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

这个方法也可以用作装饰器。当用作装饰者时,name注册functionname。如果不 name给出, function.__name__将会被使用。

更改版本3.7:register_function()可以作为装饰者使用.

SimpleXMLRPCServer.register_instanceinstance, allow_dotted_names=False

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

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

Warning

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

SimpleXMLRPCServer.register_introspection_functions ()

注册XML-RPC内省函数system.listMethods,system.methodHelpsystem.methodSignature.

SimpleXMLRPCServer.register_multicall_functions

注册XML-RPC多线程函数system.multicall。

SimpleXMLRPCRequestHandler.rpc_paths

一个属性值,必须是一个元组,列出了接收XML的URL的有效路径部分 -RPC请求。发布到其他路径的请求将导致a404“无此页面”HTTP错误。如果此元组为空,则所有路径都将被视为有效。默认值为("/", "/RPC2").

SimpleXMLRPCServer示例

服务器代码:

from xmlrpc.server import SimpleXMLRPCServerfrom xmlrpc.server import SimpleXMLRPCRequestHandler# Restrict to a particular path.class RequestHandler(SimpleXMLRPCRequestHandler):    rpc_paths = ("/RPC2",)# Create serverwith SimpleXMLRPCServer(("localhost", 8000),                        requestHandler=RequestHandler) as server:    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 "mul").    class MyFuncs:        def mul(self, x, y):            return x * y    server.register_instance(MyFuncs())    # Run the server"s main loop    server.serve_forever()

以下客户端代码将调用前面提供的方法:

import xmlrpc.clients = xmlrpc.client.ServerProxy("http://localhost:8000")print(s.pow(2,3))  # Returns 2**3 = 8print(s.add(2,3))  # Returns 5print(s.mul(5,2))  # Returns 5*2 = 10# Print list of available methodsprint(s.system.listMethods())

register_function()也可以用作装饰者。前面的示例可以以装饰器的方式注册函数:

from xmlrpc.server import SimpleXMLRPCServerfrom xmlrpc.server import SimpleXMLRPCRequestHandlerclass RequestHandler(SimpleXMLRPCRequestHandler):    rpc_paths = ("/RPC2",)with SimpleXMLRPCServer(("localhost", 8000),                        requestHandler=RequestHandler) as server:    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, using    # register_function as a decorator. *name* can only be given    # as a keyword argument.    @server.register_function(name="add")    def adder_function(x, y):        return x + y    # Register a function under function.__name__.    @server.register_function    def mul(x, y):        return x * y    server.serve_forever()

Lib/xmlrpc/server.py模块中包含的以下示例显示了一个允许点名并注册多个函数的服务器.

警告

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

import datetimeclass ExampleService:    def getData(self):        return "42"    class currentTime:        @staticmethod        def getCurrentTime():            return datetime.datetime.now()with SimpleXMLRPCServer(("localhost", 8000)) as server:    server.register_function(pow)    server.register_function(lambda x,y: x+y, "add")    server.register_instance(ExampleService(), allow_dotted_names=True)    server.register_multicall_functions()    print("Serving XML-RPC on localhost port 8000")    try:        server.serve_forever()    except KeyboardInterrupt:        print("\nKeyboard interrupt received, exiting.")        sys.exit(0)

可以从命令行调用此ExampleService演示:

python -m xmlrpc.server

与上述服务器交互的客户端包含在 Lib / xmlrpc / client.py

server = ServerProxy("http://localhost:8000")try:    print(server.currentTime.getCurrentTime())except Error as v:    print("ERROR", v)multi = MultiCall(server)multi.getData()multi.pow(2,9)multi.add(1,2)try:    for response in multi():        print(response)except Error as v:    print("ERROR", v)

这个与演示XMLRPC服务器交互的客户端可以调用为:

python -m xmlrpc.client

CGIXMLRPCRequestHandler

CGIXMLRPCRequestHandler类可以用来处理发送到Python CGI脚本的XMLRPCrequests.

CGIXMLRPCRequestHandler.register_functionfunction=None, name=None

注册一个可以响应XMLRPC请求的函数。如果给出name,它将是与function关联的方法名称,否则将使用function.__name__name是一个字符串,可能包含Python标识符中不合法的字符,包括句点字符.

这个方法也可以用作装饰器。当用作装饰者时,name注册functionname。如果不 name给出, function.__name__将会被使用。

更改版本3.7:register_function()可以作为装饰者使用.

CGIXMLRPCRequestHandler.register_instanceinstance

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

CGIXMLRPCRequestHandler.register_introspection_functions

注册XML-RPC内省函数system.listMethods,system.methodHelpsystem.methodSignature.

CGIXMLRPCRequestHandler.register_multicall_functions

注册XML-RPC multicall函数system.multicall.

CGIXMLRPCRequestHandler.handle_requestrequest_text=None

处理XML-RPC请求。如果给出request_text,它应该是HTTP服务器提供的POSTdata,否则将使用stdin的内容.

示例

class MyFuncs:    def mul(self, x, y):        return x * yhandler = 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()

文档XMLRPC服务器

这些类扩展了上述类,以响应HTTP GET请求提供HTML文档。服务器可以是独立的,使用DocXMLRPCServer,也可以嵌入CGI环境中,使用DocCGIXMLRPCRequestHandler.

class xmlrpc.server.DocXMLRPCServeraddr, requestHandler=DocXMLRPCRequestHandler, logRequests=True, allow_none=False, encoding=None, bind_and_activate=True, use_builtin_types=True

创建一个新的服务器实例。所有参数的含义与SimpleXMLRPCServer的含义相同;requestHandler默认为DocXMLRPCRequestHandler.

在版本3.3中更改:添加了use_builtin_types标志.

class xmlrpc.server.DocCGIXMLRPCRequestHandler

创建一个新实例来处理XML-CGI环境中的RPC请求.

class xmlrpc.server.DocXMLRPCRequestHandler

创建一个新的请求处理程序实例。此请求处理程序支持XML-RPCPOST请求,文档GET请求,并修改日志记录,以便logRequests参数到DocXMLRPCServer构造函数参数ishonored.

DocXMLRPCServer Objects

DocXMLRPCServer类来自SimpleXMLRPCServer并提供了一种创建自我文档,独立的XML-RPC服务器的方法。HTTP POST请求作为XML-RPC方法调用处理。通过生成pydoc样式的HTML文档来处理HTTP GET请求。这允许服务器提供自己的基于Web的文档.

DocXMLRPCServer.set_server_title (server_title)

设置生成的HTML文档中使用的标题。这个标题将在HTML“title”元素中使用.

DocXMLRPCServer.set_server_name (server_name)

设置生成的HTML文档中使用的名称。此名称将出现在“h1”元素内生成的文档的顶部.

DocXMLRPCServer.set_server_documentation (server_documentation)

设置生成的HTML文档中使用的描述。该描述将在文档中显示为服务器名称下方的段落.

DocCGIXMLRPCRequestHandler

DocCGIXMLRPCRequestHandler类来自CGIXMLRPCRequestHandler并提供了一种创建自我记录的XML-RPC CGI脚本的方法。HTTP POST请求作为XML-RPCmethod调用处理。通过生成pydoc样式的HTML文档来处理HTTP GET请求。这允许服务器提供自己的基于Web的文档.

DocCGIXMLRPCRequestHandler.set_server_title (server_title)

设置生成的HTML文档中使用的标题。这个标题将在HTML“title”元素中使用.

DocCGIXMLRPCRequestHandler.set_server_name (server_name)

设置生成的HTML文档中使用的名称。此名称将出现在“h1”元素内生成的文档的顶部.

DocCGIXMLRPCRequestHandler.set_server_documentation (server_documentation)

设置生成的HTML文档中使用的描述。此描述将在文档中显示为服务器名称下方的段落.

评论被关闭。