IP-адрес клиента в Python SimpleXMLRPCServer? - PullRequest
4 голосов
/ 25 января 2010

У меня есть SimpleXMLRPCServer сервер (Python).

Как я могу получить IP-адрес клиента в обработчике запросов?

Эта информация появляется в журнале. Однако я не уверен, как получить доступ к этой информации из обработчика запросов.

Ответы [ 3 ]

4 голосов
/ 08 июня 2010

Как заметил Майкл, вы можете получить 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)
3 голосов
/ 25 января 2010

Сам обработчик запроса должен иметь свойство client_address (унаследовано от BaseHTTPRequestHandler). От BaseHTTPRequestHandler :

Содержит кортеж формы (host, port) со ссылкой на адрес клиента.

2 голосов
/ 13 сентября 2011

Один из способов передачи 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()

и соответственно обновите сигнатуры вашего метода.

...