Python请求模块在套接字连接上挂起,但cURL有效

时间:2018-10-19 03:21:19

标签: python http docker curl python-requests

我正在尝试在Docker容器之间发出GET / POST请求。

在其中一个中(其他都可以正常工作),请执行以下操作:

ADDR = 'http://172.20.0.2:5002/see'
r = requests.post(ADDR, data=data, headers=headers)

该命令会在尝试连接时永久挂起(或直到超时,如果已定义)。它甚至从未建立连接:

^CTraceback (most recent call last):
  File "/workspace/master_server.py", line 35, in <module>
    r = requests.post(ADDR, data=data, headers=headers)
  File "/usr/local/lib/python3.5/dist-packages/requests/api.py", line 112, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/requests/api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/requests/sessions.py", line 508, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python3.5/dist-packages/requests/sessions.py", line 618, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/requests/adapters.py", line 440, in send
    timeout=timeout
  File "/usr/local/lib/python3.5/dist-packages/urllib3/connectionpool.py", line 601, in urlopen
    chunked=chunked)
  File "/usr/local/lib/python3.5/dist-packages/urllib3/connectionpool.py", line 357, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/usr/lib/python3.5/http/client.py", line 1106, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib/python3.5/http/client.py", line 1151, in _send_request
    self.endheaders(body)
  File "/usr/lib/python3.5/http/client.py", line 1102, in endheaders
    self._send_output(message_body)
  File "/usr/lib/python3.5/http/client.py", line 934, in _send_output
    self.send(msg)
  File "/usr/lib/python3.5/http/client.py", line 877, in send
    self.connect()
  File "/usr/local/lib/python3.5/dist-packages/urllib3/connection.py", line 166, in connect
    conn = self._new_conn()
  File "/usr/local/lib/python3.5/dist-packages/urllib3/connection.py", line 141, in _new_conn
    (self.host, self.port), self.timeout, **extra_kw)
  File "/usr/local/lib/python3.5/dist-packages/urllib3/util/connection.py", line 73, in create_connection
    sock.connect(sa)

如果我使用bash中的curl运行完全相同的请求,则它会很轻松地工作:

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '"[1215 2589 1392 3019]"' 'http://172.20.0.2:5002/see'

我尝试以完全相同的方式使用的其他任何容器都可以与请求模块或curl一起使用。对如何解决它或至少有效地调试问题有帮助吗?

3 个答案:

答案 0 :(得分:1)

我最近在本地遇到了同样的问题,就像对原始问题的一些评论一样,我的代码在Windows中工作,但在Linux中工作。几个小时后,找到了我的案例的罪魁祸首:IPv6。

我使用的python模块尝试与服务器建立套接字连接,默认情况下使用IPv6。在Linux环境(Ubuntu 18.04)中关闭IPv6之后,请执行以下步骤:

  1. 打开终端
  2. 输入:$unwind
  3. 输入:{ $unwind: { path: '$parent', preserveNullAndEmptyArrays: true } }

该模块按预期工作**。

**请注意,这些步骤可能会因环境而异

答案 1 :(得分:0)

我遇到了同样的问题,浪费了很多时间...就我而言,问题如下(guniconf.py):

workers = 1

更改为:

workers = 10  # any number is greater than 1

更多:有一个Flask应用程序可以提供一些REST API。 该应用程序具有REST API方法(我们称其为A方法),该方法在内部使用requests.post()调用了另一个REST API方法(我们称其为B方法)。从A方法调用B方法时,应用程序挂起。 据我了解,当调用A方法时,gunicorn工人会对其进行处理,但是使用B方法时,将不再有工人。

答案 2 :(得分:0)

我最近在macOS(Catalina)上遇到了同样的问题,事实证明这是由于IPv6造成的。

我必须转到“系统偏好设置”->“网络”->“ Wi-Fi”->“高级”->“ TCP / IP”,然后将“配置IPv6”更改为“仅链接本地”(尽管列表中没有“关闭”选项)这也将适用)。然后单击确定并应用。

您还可以使用以下方法完全禁用

sudo networksetup -setv6off Wi-Fi