为什么requests.get()没有返回?requests.get()使用的默认超时时间是多少?

11 浏览
0 Comments

为什么requests.get()没有返回?requests.get()使用的默认超时时间是多少?

在我的脚本中,requests.get从未返回:\n

import requests
print ("请求中..")
# 这个调用从未返回!
r = requests.get(
    "http://www.some-site.example",
    proxies = {'http': '222.255.169.74:8080'},
)
print(r.ok)

\n可能的原因是什么?有什么解决办法?get使用的默认超时时间是多少?

0
0 Comments

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,...

0
0 Comments

为什么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库的请求将不会设置超时时间。

0
0 Comments

为什么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毫秒或更短的超时时间,才能在服务器发送响应时立即得到响应。

0