共计 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'
,并没有这两个参数。
答案 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
无语,直接报错。。。
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 请求之前调用。
正文完