在Python中组合SimpleXMLRPCServer和BaseHTTPRequestHandler

2024-05-15 16:37:53 发布

您现在位置:Python中文网/ 问答频道 /正文

因为跨域xmlrpc请求在JavaScript中是不可能的 我需要创建一个Python应用程序,它通过HTTP公开一些HTML,并在同一个域上公开XML-RPC服务。在

在python中创建HTTP请求处理程序和SimpleXMLRPCServer非常简单, 但它们都必须监听不同的端口,这意味着不同的域。在

有没有一种方法可以在本地主机上的单个端口上创建侦听器 并公开HTTPRequestHandler和XMLRPCRequest处理程序?在

现在我有两种不同的服务:

httpServer = HTTPServer(('localhost',8001), HttpHandler);
xmlRpcServer = SimpleXMLRPCServer(('localhost',8000),requestHandler=RequestHandler)

更新

  • 我无法在设备上安装Apache
  • 托管页面将是一个单独的html页面
  • 唯一的客户机将是运行python服务的设备

Tags: 方法端口应用程序localhosthttp处理程序html页面
3条回答

使用HTTPServer来提供内容不是一个好主意。您应该使用像Apache这样的web服务器,并将Python用作CGI(或更高级的接口,如mod_wsgi)。在

然后,web服务器在一个端口上运行,您可以直接在web服务器上运行HTML,并在Python中编写任意数量的CGI脚本,例如使用CGIXMLRPCRequestHandler为XMLRPC请求编写的CGI脚本。在

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()

根据韦业栋的回答,解决方案其实相当简单:

我所要做的就是继续使用SimpleXMLRPCServer实例, 但是修改处理程序:

class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)

    def do_GET(self):
          #implementation here

这将导致处理程序响应GET请求和原始POST(XML-RPC)请求。在

它们都是SocketServer.TCPServer的子类。必须有某种方法来重构它们,以便once服务器实例可以分派给两者。在

一个更简单的选择可能是将HTTPServer放在前面,并将xmlrpc代理到SimpleXMLRPCServer实例。在

相关问题 更多 >