Python SimpleXMLRPCServer中客户端的IP地址?

时间:2010-01-24 23:27:18

标签: python ip-address xml-rpc simplexmlrpcserver

我有一个SimpleXMLRPCServer服务器(Python)。

如何在请求处理程序中获取客户端的IP地址?

此信息显示在日志中。但是,我不知道如何从请求处理程序中访问此信息。

3 个答案:

答案 0 :(得分:4)

正如Michael所说,您可以从请求处理程序中获取client_address。例如,您可以覆盖从__init__间接继承的BaseRequestHandler函数。

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)

答案 1 :(得分:3)

请求处理程序本身应具有属性client_address(继承自BaseHTTPRequestHandler)。来自BaseHTTPRequestHandler

  

包含(host, port)形式的元组,引用客户端的地址。

答案 2 :(得分: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()

并相应地更新您的方法签名。