【问题标题】:Python requests module hangs on socket connection but cURL worksPython 请求模块挂在套接字连接上,但 cURL 有效
【发布时间】:2019-03-23 22:29:42
【问题描述】:

我正在尝试在 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 一起使用。有关如何修复它或至少有效地调试问题的任何帮助?

【问题讨论】:

  • 我现在也有同样的问题。它可以在 Windows 上运行,但现在 ubuntu 挂起(使用 python3、robobrowser)
  • 同样的问题,在windows本地工作,在ubuntu ec2服务器上挂起
  • 你想在容器内卷曲吗?

标签: python http docker curl python-requests


【解决方案1】:

我最近在 macOS (Catalina) 上遇到了同样的问题,结果是由于 IPv6。

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

您也可以使用以下方法完全禁用:

sudo networksetup -setv6off Wi-Fi

【讨论】:

    【解决方案2】:

    我最近在本地遇到了同样的问题,就像原始问题上的一些 cmets 一样,我的代码在 windows 中运行,但在 linux 中运行。几个小时后找到了我的案子的罪魁祸首:IPv6。

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

    1. 打开终端
    2. 输入:sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
    3. 输入:sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1

    模块按预期工作**。

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

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,浪费了很多时间......在我的情况下,问题如下(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 方法时,没有更多工作人员。

      【讨论】:

        猜你喜欢
        • 2019-03-06
        • 2011-01-19
        • 1970-01-01
        • 2014-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-12
        • 2020-06-17
        相关资源
        最近更新 更多