在Python中结合SimpleXMLRPCServer和BaseHTTPRequestHandler
因为在JavaScript中,跨域的xmlrpc请求是行不通的,所以我需要创建一个Python应用,它可以通过HTTP提供一些HTML内容,同时在同一个域名下提供一个XML-RPC服务。
在Python中创建一个HTTP请求处理器和一个SimpleXMLRPCServer其实很简单,但它们必须监听不同的端口,这就意味着它们在不同的域名下。
有没有办法创建一个东西,让它在本地的同一个端口上监听,并同时提供HTTPRequestHandler和XMLRPCRequest处理器呢?
现在我有两个不同的服务:
httpServer = HTTPServer(('localhost',8001), HttpHandler);
xmlRpcServer = SimpleXMLRPCServer(('localhost',8000),requestHandler=RequestHandler)
更新
- 我无法在设备上安装Apache
- 托管的页面将是一个单独的HTML页面
- 唯一的客户端就是运行Python服务的设备本身
3 个回答
0
用 HTTPServer
来提供内容其实不是个好主意。你应该使用像 Apache 这样的网络服务器,然后用 Python 来做 CGI(或者用更高级的接口,比如 mod_wsgi
)。
这样,网络服务器就会在一个端口上运行,你可以直接通过这个服务器提供 HTML 内容,并且可以用 Python 写很多 CGI 脚本,比如一个处理 XMLRPC 请求的脚本,使用 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()
2
这两个都是SocketServer.TCPServer
的子类。我们需要找到一种方法来重构它们,这样一个服务器实例就可以同时处理这两个。
一个更简单的办法可能是把HTTPServer
放在前面,然后把XML RPC的请求转发给SimpleXMLRPCServer
的实例。
2
这个解决方案其实很简单,主要是根据Wai Yip Tung的回复:
我只需要继续使用SimpleXMLRPCServer这个实例,但要修改一下处理程序:
class RequestHandler(SimpleXMLRPCRequestHandler):
rpc_paths = ('/RPC2',)
def do_GET(self):
#implementation here
这样一来,处理程序就可以同时响应GET请求和原来的POST(XML-RPC)请求了。