在Python中结合SimpleXMLRPCServer和BaseHTTPRequestHandler

时间:2010-08-24 21:22:04

标签: python httpserver simplexmlrpcserver

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

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

有没有办法创建可以在localhost上的单个端口上侦听的内容 并公开HTTPRequestHandler和XMLRPCRequest处理程序?

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

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

更新

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

3 个答案:

答案 0 :(得分:2)

它们都是SocketServer.TCPServer的子类。必须有一些重构它们,以便一旦服务器实例可以分派给它们。

更简单的替代方法可能是将HTTPServer放在前面并将XML RPC代理到SimpleXMLRPCServer实例。

答案 1 :(得分:2)

根据Wai Yip Tung的回复,解决方案实际上非常简单:

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

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

    def do_GET(self):
          #implementation here

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

答案 2 :(得分:0)

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

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

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