我正在尝试在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一起使用。对如何解决它或至少有效地调试问题有帮助吗?
答案 0 :(得分:1)
我最近在本地遇到了同样的问题,就像对原始问题的一些评论一样,我的代码在Windows中工作,但在Linux中工作。几个小时后,找到了我的案例的罪魁祸首:IPv6。
我使用的python模块尝试与服务器建立套接字连接,默认情况下使用IPv6。在Linux环境(Ubuntu 18.04)中关闭IPv6之后,请执行以下步骤:
$unwind
{ $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