请求没有响应来自其他IP而不是localhost

时间:2017-11-02 13:21:45

标签: python python-2.7 python-3.x python-requests

我应该向我们的其他网址提出获取请求,这会触发服务器上的某些活动并最终返回响应。返回响应可能需要超过30分钟。我知道请求没有默认超时。但是,当我提出获取请求时,即使服务器发回响应,30分钟后,请求也不会返回。我确认服务器从日志文件发送了响应。我甚至尝试过使用请求会话,这样我的连接就可以了。它的行为仍然相同。我使用requests v.2.13.0.这是版本问题还是请求问题。如果请求有问题,我如何提出等待服务器发回响应的get请求?无论如何我的代码很简单,我可以添加以供参考。

import requests
url="www.abcd/efg/hijkl"
response=requests.get(url) #It hangs at this point even if server sends back response.

我使用邮差和谷歌浏览器测试了相同的内容,两者都能在30分钟后得到响应。同样通过将请求更新为2.18.4仍然是同一个问题来尝试相同的。

编辑1:

如果请求从服务器引发到localhost,则相同的代码可以正常工作。根据@ randomir的建议,似乎是network connection might getting dropped inbetween的问题,但是如何从客户端处理这个问题,因为很难实现任何服务器端方法。

2 个答案:

答案 0 :(得分:4)

您的持久性零活动网络连接可能会被中间代理,防火墙,路由器,NAT等丢弃。requests.get()永远不会发现它,因为它被动地等待响应。

在TCP层上防止这种情况的一种方法是使用TCP keep-alive(默认情况下通常 off )。

在Python中,您可以通过低级socket.setsockopt直接配置TCP keep-alive,但由于您已经在使用requests,因此更简单的方法是通过TCPKeepAliveAdapter提供requests_toolbelt包裹:

import requests
from requests_toolbelt.adapters.socket_options import TCPKeepAliveAdapter

url = '...'
session = requests.Session()
keep_alive = TCPKeepAliveAdapter(idle=120, count=20, interval=30)
session.mount(url, keep_alive)
session.get(url)

答案 1 :(得分:0)

经过这么多的研究和调试后发现了问题。问题在于apache webserver 中的 代理,因为我们重定向连接,公共接口有近三个重定向,连接从 <重定向到本地Web服务器em>本地Web服务器 该连接再次被重定向到 api端点 。从api连接再次重定向到 另一个api 。所以现在因为api需要很长时间来响应apache webserver 认为连接已经丢失并返回代理错误。所以,如果我直接点击其余的api终点,它工作正常。感谢您@randomiranswer帮助我解决问题。