🔥商务合作或网站问题请联系站长🛰️号:lcz_195、邮箱: cyunzing@qq.com

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

386次阅读
一条评论

共计 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协议发布,转载请注明出处。
⚠️【网络并非法外之地】请和谐发言,勿发表违法违规评论
评论(一条评论)
cyunzing 博主
2025-06-03 22:54:56 回复

test :?:

 Macintosh  Safari  中国广东省广州市移动