2010-01-24 3 views

답변

3

Michael이 지적했듯이 client_address은 요청 처리기에서 가져올 수 있습니다. 예를 들어 BaseRequestHandler에서 간접적으로 상속 된 __init__ 함수를 재정의 할 수 있습니다.

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에 액세스하려면 어떻게해야합니까? 자체 매개 변수가 없습니다. –

2

요청 방법에 IP 주소를 전달하는 한 가지 방법은 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() 

그리고 서명 방식을 적절히 업데이트하십시오.