从httpx-get的响应中获取服务器ip



正如标题所说,如果我执行resp=httpx.get(url),我如何获得解析url的IP?

这个问题是关于如何使用requests,但在httpx对象中似乎不存在相同的方法。

从经验上讲,你可以用一个非常丑陋的咒语来完成,如下所示。

请注意,这涉及到挖掘响应流的不少于6个下划线的私有属性,因此在升级httpx时,它可能随时停止工作。(这对我的httpx 0.23.0有效。(

import httpx
with httpx.Client() as hc:
r = hc.get("https://httpbin.org/get")
peername = r.stream._stream._httpcore_stream._stream._connection._network_stream._sock.getpeername()
print(r.json())
print(peername)

这会打印出

{'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-httpx/0.23.0', 'X-Amzn-Trace-Id': 'Root=...'}, 'origin': '....', 'url': 'https://httpbin.org/get'}
('44.207.168.240', 443)

我想解决同样的问题。我担心转发的兼容性";精致丑陋的咒语;此处的答案中提供。我在Trio中使用httpx,并意识到我可以使用Trio套接字实现来使用异步版本的套接字来回答这个问题。请参阅:https://trio.readthedocs.io/en/stable/reference-io.html#trio.socket.getaddrinfo

我把这个问题发布到httpxQ&答:https://github.com/encode/httpx/discussions/2633#discussioncomment-5439764简而言之,对这些信息的访问是通过httpcore提供的。更新文档存在一个悬而未决的问题。

import httpx
with httpx.Client() as client:
with client.stream("GET", "https://httpbin.org/get") as response:
network_stream = response.extensions["network_stream"]
server_addr = network_stream.get_extra_info("server_addr")
print(response.json())
print(server_addr)

阅读:https://www.encode.io/httpcore/extensions/#extra-网络信息

最新更新