2010-01-24 260 views

回答

3

正如Michael指出的那樣,您可以從請求處理程序中獲取client_address。例如,您可以覆蓋從BaseRequestHandler間接繼承的__init__函數。到IP地址傳遞給請求的方法

class RequestHandler(SimpleXMLRPCRequestHandler): 
    def __init__(self, request, client_address, server): 
     print client_address # do what you need to do with client_address here 
     SimpleXMLRPCRequestHandler.__init__(self, request, client_address, server) 
2

請求處理程序本身應該有一個屬性client_address(從BaseHTTPRequestHandler繼承)。從BaseHTTPRequestHandler

包含形式爲(host, port)的元組引用客戶的地址。

+2

如何從請求方法本身訪問RequestHandler?沒有自我參數。 – 2010-01-24 23:55:31

2

的一種方法是重寫RequestHandler.decode_request_content。

decode_request_content返回一個XML字符串。 例子:

<?xml version='1.0'?> 
<methodCall> 
    <methodName>get_workunit</methodName> 
    <params> 
     <param> 
      <value><int>1</int></value> 
     </param> 
     <param> 
      <value><string>Windows</string></value> 
     </param> 
     <param> 
      <value><string>32bit</string></value> 
     </param> 
    </params> 
</methodCall> 

只需把另一個參數在裏面。

class HackyRequestHandler(SimpleXMLRPCRequestHandler): 
    def __init__(self, req, addr, server): 
     self.client_ip, self.client_port = addr 
     SimpleXMLRPCRequestHandler.__init__(self, req, addr, server) 
    def decode_request_content(self, data): 
     data = SimpleXMLRPCRequestHandler.decode_request_content(self, data) 
     from xml.dom.minidom import parseString 
     doc = parseString(data) 
     ps = doc.getElementsByTagName('params')[0] 
     pdoc = parseString(
      ''' <param><value> 
       <string>%s</string> 
       </value></param>''' % (self.client_ip,)) 
     p = pdoc.firstChild.cloneNode(True) 
     ps.insertBefore(p, ps.firstChild) 
     return doc.toxml() 

並相應地更新您的方法簽名。