为什么requests.get()没有返回?requests.get()使用的默认超时时间是多少?
requests.get()函数没有返回的原因是因为它在执行网络请求时没有设置超时时间。默认情况下,requests.get()函数没有设置超时时间,因此当网络请求遇到问题时,它会一直等待响应,直到超时为止。
为了解决这个问题,可以使用上述代码提供的解决方案。这段代码定义了一个requests_retry_session()函数,它创建了一个具有重试行为的会话对象。在这个函数中,通过设置max_retries参数来指定重试的次数,backoff_factor参数指定了重试之间的退避因子,status_forcelist参数指定了在哪些HTTP状态码下需要进行重试。
在代码的最后一部分,通过遍历所有的HTTP方法,使用functools.partial()函数将每个方法的timeout参数设为默认值30。这样,在使用requests.get()函数时,就会自动应用默认的超时时间。
使用上述代码后,可以像下面这样使用requests.get()函数:
requests_session = requests_retry_session() r = requests_session.get(url=url,...
为什么requests.get()不返回?requests.get()使用的默认超时时间是多少?
问题出现的原因:
根据requests文档,timeout参数并不是整个响应下载的时间限制,而是在timeout秒内如果服务器没有返回任何数据,就会引发异常。因此,即使设置了timeout参数,requests.get()仍然可能需要很长时间才能返回。
解决方法:
1. 使用TimeoutSauce内部类:通过修改requests库的源代码,可以使用TimeoutSauce类来设置连接超时和读取超时的时间。具体实现代码如下:
import requests from requests.adapters import TimeoutSauce class MyTimeout(TimeoutSauce): def __init__(self, *args, **kwargs): if kwargs['connect'] is None: kwargs['connect'] = 5 if kwargs['read'] is None: kwargs['read'] = 5 super(MyTimeout, self).__init__(*args, **kwargs) requests.adapters.TimeoutSauce = MyTimeout
这段代码将读取超时设置为连接超时的时间,即设置了Session.get()调用时的超时值。
2. 使用kevinburke的requests分支:可以使用kevinburke的requests分支来设置连接超时和读取超时的时间。具体使用方法如下:
r = requests.get('https://github.com', timeout=(3.05, 27))
这样可以分别设置连接超时和读取超时的时间。
3. 使用evenlet或signal:可以使用evenlet或signal库来设置请求的超时时间。具体实现方法可以参考类似问题的回答。
关于默认超时时间的问题,根据文档的说明,如果没有显式指定timeout参数,requests库的请求将不会设置超时时间。
为什么requests.get()不返回任何内容?requests.get()使用的默认超时时间是多少?
requests.get()默认的超时时间是None,这意味着它会一直等待(挂起),直到连接关闭。
要指定超时时间,可以像下面这样操作:
r = requests.get(
'http://www.example.com',
proxies={'http': '222.255.169.74:8080'},
timeout=5
)
我认为你是对的。None表示无限期等待(或者等待连接关闭)。如果我自己传递超时时间,它就会返回内容!timeout对于https和http都可以正常工作。
这个问题在文档中很难通过谷歌或其他方式找到。有人知道这在文档中的哪个位置吗?
文档中的位置是:docs.python-requests.org/en/master/user/quickstart/#timeouts
谢谢,不过在IPython中执行print(requests.request.__doc__)更接近我要找的内容。我想知道request.get()还有哪些可选参数。
这不是一个糟糕的设计吗?
嗯?不是的。你在说什么?
即使使用timeout参数?
我只是说,如果请求默认假定一个超时时间,比如30秒,而不是在没有提供超时时间时无限期等待,这是有意义的。就像其他请求库一样。
我明白了,谢谢你的澄清。你的评论只说“这个”,听起来像是在说我的答案是一个糟糕的设计,但你真正的意思是requests.get是一个糟糕的设计。
超时的文档:docs.python-requests.org/en/master/user/advanced/#timeouts
文档似乎已经移动,上述域名无效,新的位置是:requests.readthedocs.io/en/latest/user/advanced/#timeouts
对我来说,在Python 3.8上,requests模块的工作方式很奇怪。服务器返回的速度非常快,少于1毫秒。但是如果我不定义超时时间或者给一个很长的时间,比如5秒,响应会在大约2秒钟之后显示出来。我不得不显式地设置一个约为10毫秒或更短的超时时间,才能在服务器发送响应时立即得到响应。