私はSimpleXMLRPCServerサーバー (Python) を持っています。
リクエスト ハンドラでクライアントの IP アドレスを取得するにはどうすればよいですか?
この情報はログに表示されます。ただし、リクエスト ハンドラ内からこの情報にアクセスする方法がわかりません。
私はSimpleXMLRPCServerサーバー (Python) を持っています。
リクエスト ハンドラでクライアントの IP アドレスを取得するにはどうすればよいですか?
この情報はログに表示されます。ただし、リクエスト ハンドラ内からこの情報にアクセスする方法がわかりません。
client_address
Michaelが指摘したように、リクエストハンドラ内から取得できます。たとえば、__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 アドレスをリクエスト メソッドに渡す 1 つの方法は、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()
それに応じてメソッド シグネチャを更新します。