记:用python3的request库强制IPV4请求时踩的坑

258次阅读

共计 2741 个字符,预计需要花费 7 分钟才能阅读完成。

缘起

由于写了个小脚本,用于控制服务器上的访问端口 IP 白名单。其中脚本会请求多个接口返回出口的 ip 地址,后期用于设置访问 IP 白名单。
以往一直用的好好的,但是近来不知为何总是获取到了 IPV6 的地址。
于是乎,便开始了我的搜索踩坑之旅 …

答案 1 坑 1

import socket
import requests

# 设置 socket 的参数,强制使用 IPv4
socket_af = socket.AF_INET
socket_family = socket.AF_INET

# 创建请求
response = requests.get("http://example.com", socket_family=socket_af, socket_type=socket_family)

# 打印响应内容
print(response.text)

通过设置 socket.AF_INET 来指定 socket 的地址族为 IPv4,创建了一个请求并指定了 socket_family 参数为socket.AF_INET

原帖大概意思是说起到了上述这个作用,但是实际使用下来却提示 Session.request() got an unexpected keyword argument 'socket_family'Session.request() got an unexpected keyword argument 'socket_type',并没有这两个参数。

记:用 python3 的 request 库强制 IPV4 请求时踩的坑

答案 2 坑 2

import socket
import requests.packages.urllib3.util.connection as urllib3_cn

def allowed_gai_family():
    """
     https://github.com/shazow/urllib3/blob/master/urllib3/util/connection.py
    """
    family = socket.AF_INET
    if urllib3_cn.HAS_IPV6:
        family = socket.AF_INET6 # force ipv6 only if it is available
    return family

urllib3_cn.allowed_gai_family = allowed_gai_family

记:用 python3 的 request 库强制 IPV4 请求时踩的坑

无语,直接报错。。。

Traceback (most recent call last):

File "xxx/main.py", line 55, in <module>

createSecurityGroupRule(2345)

~~~~~~~~~~~~~~~~~~~~~~~^^^^^^

File "xxx/main.py", line 47, in createSecurityGroupRule

resp = requests.request(r.method, r.scheme + "://" + r.host + r.uri, headers=r.headers, data=r.body)

File "xxx/lib/python3.13/site-packages/requests/api.py", line 59, in request

return session.request(method=method, url=url, **kwargs)

~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "xxx/lib/python3.13/site-packages/requests/sessions.py", line 589, in request

resp = self.send(prep, **send_kwargs)

File "xxx/lib/python3.13/site-packages/requests/sessions.py", line 703, in send

r = adapter.send(request, **kwargs)

File "xxx/lib/python3.13/site-packages/requests/adapters.py", line 667, in send

resp = conn.urlopen(

method=request.method,

...<9 lines>...

chunked=chunked,

)

File "xxx/lib/python3.13/site-packages/urllib3/connectionpool.py", line 787, in urlopen

response = self._make_request(

conn,

...<10 lines>...

**response_kw,

)

File "xxx/lib/python3.13/site-packages/urllib3/connectionpool.py", line 464, in _make_request

self._validate_conn(conn)

~~~~~~~~~~~~~~~~~~~^^^^^^

File "xxx/lib/python3.13/site-packages/urllib3/connectionpool.py", line 1093, in _validate_conn

conn.connect()

~~~~~~~~~~~~^^

File "xxx/lib/python3.13/site-packages/urllib3/connection.py", line 704, in connect

self.sock = sock = self._new_conn()

~~~~~~~~~~~~~~^^

File "xxx/lib/python3.13/site-packages/urllib3/connection.py", line 198, in _new_conn

sock = connection.create_connection((self._dns_host, self.port),

...<2 lines>...

socket_options=self.socket_options,

)

File "xxx/lib/python3.13/site-packages/urllib3/util/connection.py", line 53, in create_connection

family = allowed_gai_family()

TypeError: 'AddressFamily' object is not callable

答案 3 正解

requests.packages.urllib3.util.connection.HAS_IPV6 = False

这是我试了三个答案当中唯一一个好使的,在初始化的时候调用,即 requests 请求之前调用。

正文完
 6
cyunzing
版权声明:本站原创文章,由 cyunzing 于2025-05-26发表,共计2741字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。