Python SimpleXMLRPCServer中的客户端IP地址?

4 投票
3 回答
5833 浏览
提问于 2025-04-15 18:25

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

我想知道在处理请求的时候,怎么才能获取到客户端的IP地址?

这个信息会出现在日志里。不过,我不太确定怎么在请求处理程序里访问到这些信息。

3 个回答

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()

然后相应地更新你的方法签名。

3

请求处理器本身应该有一个属性叫做 client_address,这个属性是从 BaseHTTPRequestHandler 继承来的。关于 BaseHTTPRequestHandler,你可以在这里找到更多信息:BaseHTTPRequestHandler

这个属性包含一个元组,格式是 (host, port),它指的是客户端的地址。

4

正如迈克尔提到的,你可以在请求处理器里面获取到 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)

撰写回答