我有一个SimpleXMLRPCServer服务器(Python)。
如何在请求处理程序中获取客户端的 IP 地址?
此信息出现在日志中。但是,我不确定如何从请求处理程序中访问此信息。
正如 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)
请求处理程序本身应该有一个属性client_address
(继承自BaseHTTPRequestHandler
)。从BaseHTTPRequestHandler:
包含
(host, port)
引用客户地址的表单元组。
将 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()
并相应地更新您的方法签名。