4

私はSimpleXMLRPCServerサーバー (Python) を持っています。

リクエスト ハンドラでクライアントの IP アドレスを取得するにはどうすればよいですか?

この情報はログに表示されます。ただし、リクエスト ハンドラ内からこの情報にアクセスする方法がわかりません。

4

3 に答える 3

4

client_addressMichaelが指摘したように、リクエストハンドラ内から取得できます。たとえば、__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)
于 2010-06-08T18:17:55.117 に答える
3

リクエスト ハンドラ自体にはプロパティが必要ですclient_address(から継承BaseHTTPRequestHandler)。BaseHTTPRequestHandlerから:

(host, port)クライアントのアドレスを参照する形式のタプルが含まれています。

于 2010-01-24T23:35:45.440 に答える
2

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

それに応じてメソッド シグネチャを更新します。

于 2011-09-13T16:08:38.667 に答える