因为JavaScript中无法进行跨域xmlrpc请求 我需要创建一个Python应用程序,它通过HTTP公开一些HTML,并在同一个域上公开XML-RPC服务。
在python中创建HTTP请求处理程序和SimpleXMLRPCServer非常简单, 但他们都必须在不同的端口上监听,这意味着不同的域名。
有没有办法创建可以在localhost上的单个端口上侦听的内容 并公开HTTPRequestHandler和XMLRPCRequest处理程序?
现在我有两种不同的服务:
httpServer = HTTPServer(('localhost',8001), HttpHandler);
xmlRpcServer = SimpleXMLRPCServer(('localhost',8000),requestHandler=RequestHandler)
更新
答案 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()