Python SimpleXMLRPCServer中的客户端IP地址?
我有一个 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)