3

因为跨域 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 服务自行运行的设备
4

3 回答 3

2

它们都是SocketServer.TCPServer. 必须有某种方式来重构它们,以便一旦服务器实例可以分派给两者。

一个更简单的替代方法可能是保留实例HTTPServer的前端和代理 XML RPC 。SimpleXMLRPCServer

于 2010-08-24T22:50:10.727 回答
2

解决方案其实很简单,根据伟业东的回复:

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

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

    def do_GET(self):
          #implementation here

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

于 2010-08-25T15:27:39.690 回答
0

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

然后,网络服务器在一个端口上运行,您可以直接在网络服务器上提供 HTML 服务,并在 Python 中编写任意数量的 CGI 脚本,例如使用CGIXMLRPCRequestHandler.

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()
于 2010-08-24T21:34:33.007 回答