2010-08-24 92 views
3

因爲跨域xmlrpc請求在JavaScript中不可能 我需要創建一個Python應用程序,它可以通過HTTP和同一個域上的XML-RPC服務公開一些HTML應用程序。在Python中結合使用SimpleXMLRPCServer和BaseHTTPRequestHandler

在python中創建HTTP請求處理程序和SimpleXMLRPCServer是很容易的,但它們都必須在不同的端口上偵聽,這意味着不同的域。

有沒有一種方法可以在本地主機 上的單個端口上偵聽並公開HTTPRequestHandler和XMLRPCRequest處理程序?

現在我有兩個不同的服務:

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

更新

  • 我無法在設備
  • 上安裝Apache託管頁面將是一個HTML頁面
  • 唯一的客戶端將是蟒蛇服務運行的設備

回答

2

該解決方案實際上是相當簡單的,基於偉業東的回答是:

我所要做的就是繼續使用SimpleXMLRPCServer例如, 但修改處理程序:

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

    def do_GET(self): 
      #implementation here 

這將導致處理程序響應GET請求以及原始POST(XML-RPC)請求。

0

使用HTTPServer提供內容不是一個好主意。您應該使用像Apache這樣的網絡服務器,並使用Python作爲CGI(或更高級的接口,如mod_wsgi)。

然後,網絡服務器在一個端口上運行,您可以直接在網絡服務器上服務器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() 
+0

問題是我無法在目標設備上安裝apache(作爲受限制的蘋果設備:p) – TimothyP 2010-08-24 21:57:24

2

兩者都是SocketServer.TCPServer的子類。必須有一些方法來重構它們,以便一旦服務器實例可以派發到這兩者。

一個更簡單的替代方案可能是保持HTTPServer在前面,並將XML RPC代理到SimpleXMLRPCServer實例。

+0

這幫我找到了我的解決方案 – TimothyP 2010-08-25 15:25:52