Python中如何结合SimpleXMLRPCServer和BaseHTTPRequestHandler?

3
由于JavaScript不支持跨域xmlrpc请求,我需要创建一个Python应用程序,在同一域名下同时提供一些HTML和XML-RPC服务。在Python中创建HTTP请求处理器和SimpleXMLRPCServer非常容易,但它们必须监听不同的端口,这意味着不同的域名。有没有一种方法可以创建一个在本地主机上监听单个端口并公开HTTPRequestHandler和XMLRPCRequest处理程序的东西?目前我有两个不同的服务:
httpServer = HTTPServer(('localhost',8001), HttpHandler);
xmlRpcServer = SimpleXMLRPCServer(('localhost',8000),requestHandler=RequestHandler)

更新

  • 我无法在设备上安装Apache
  • 托管的页面将是单个html页面
  • 唯一的客户端将是运行Python服务本身的设备
3个回答

2
解决方案其实非常简单,基于Wai Yip Tung的回复:
我所要做的就是继续使用SimpleXMLRPCServer实例,但修改处理程序:
class RequestHandler(SimpleXMLRPCRequestHandler):
    rpc_paths = ('/RPC2',)

    def do_GET(self):
          #implementation here

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

2

它们都是 SocketServer.TCPServer 的子类。必须有一种方法对它们进行重构,使得一个服务器实例可以分配给两者。

一个更简单的替代方案是将 HTTPServer 放在前面,并将 XML RPC 代理到 SimpleXMLRPCServer 实例。


这帮助我找到了我的解决方案。 - TimothyP

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

问题是我无法在目标设备上安装Apache(因为它是受限的苹果设备 :p)。 - TimothyP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接