Python SimpleXMLRPCServer 中客户端的 IP 地址?

发布于 2024-08-18 15:09:46 字数 250 浏览 10 评论 0原文

我有一个 SimpleXMLRPCServer 服务器(Python)。

如何在请求处理程序中获取客户端的 IP 地址?

此信息出现在日志中。但是,我不确定如何从请求处理程序中访问此信息。

I have a SimpleXMLRPCServer server (Python).

How can I get the IP address of the client in the request handler?

This information appears in the log. However, I am not sure how to access this information from within the request handler.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

不再让梦枯萎 2024-08-25 15:09:46

正如 Michael 指出的,您可以从请求处理程序中获取 client_address。例如,您可以重写从 BaseRequestHandler 间接继承的 __init__ 函数。

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)

As Michael noted, you can get client_address from within the request handler. For instance, you can override the __init__ function which is inherited indirectly from 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)
魔法少女 2024-08-25 15:09:46

请求处理程序本身应该有一个属性client_address(继承自BaseHTTPRequestHandler)。来自 BaseHTTPRequestHandler

包含一个(host, port)形式的元组,引用客户端的地址。

The request handler itself should have a property client_address (inherited from BaseHTTPRequestHandler). From BaseHTTPRequestHandler:

Contains a tuple of the form (host, port) referring to the client’s address.

凡尘雨 2024-08-25 15:09:46

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

并相应地更新您的方法签名。

One way to pass the ip address to the request method is to override RequestHandler.decode_request_content.

decode_request_content returns a XML string.
Example:

<?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>

Just slip another parameter in there.

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

and update your method signatures accordingly.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文