首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么requests.get()不返回?requests.get()使用的默认超时是多少?

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

Stack Overflow用户
提问于 2013-07-22 15:31:58
回答 3查看 115K关注 0票数 108

在我的脚本中,requests.get从不返回:

代码语言:javascript
复制
import requests

print ("requesting..")

# This call never returns!
r = requests.get(
    "http://www.some-site.com",
    proxies = {'http': '222.255.169.74:8080'},
)

print(r.ok)

可能的原因是什么?有什么补救措施吗?get使用的默认超时是多少?

EN

回答 3

Stack Overflow用户

发布于 2019-04-25 12:31:20

我想要在一堆代码中轻松添加一个默认超时(假设超时解决了您的问题)

这是我从提交给存储库的请求工单中获得的解决方案。

图片来源:https://github.com/kennethreitz/requests/issues/2011#issuecomment-477784399

解决方案是这里的最后几行,但为了更好的上下文,我展示了更多的代码。我喜欢使用会话来实现重试行为。

代码语言:javascript
复制
import requests
import functools
from requests.adapters import HTTPAdapter,Retry


def requests_retry_session(
        retries=10,
        backoff_factor=2,
        status_forcelist=(500, 502, 503, 504),
        session=None,
        ) -> requests.Session:
    session = session or requests.Session()
    retry = Retry(
            total=retries,
            read=retries,
            connect=retries,
            backoff_factor=backoff_factor,
            status_forcelist=status_forcelist,
            )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    # set default timeout
    for method in ('get', 'options', 'head', 'post', 'put', 'patch', 'delete'):
        setattr(session, method, functools.partial(getattr(session, method), timeout=30))
    return session

然后你可以这样做:

代码语言:javascript
复制
requests_session = requests_retry_session()
r = requests_session.get(url=url,...
票数 6
EN

Stack Overflow用户

发布于 2017-11-04 14:53:00

查看了所有的答案,得出了问题仍然存在的结论。在某些网站上,请求可能会无限挂起,而使用多进程似乎有点过分了。这是我的方法(Python 3.5+):

代码语言:javascript
复制
import asyncio

import aiohttp


async def get_http(url):
    async with aiohttp.ClientSession(conn_timeout=1, read_timeout=3) as client:
        try:
            async with client.get(url) as response:
                content = await response.text()
                return content, response.status
        except Exception:
            pass


loop = asyncio.get_event_loop()
task = loop.create_task(get_http('http://example.com'))
loop.run_until_complete(task)
result = task.result()
if result is not None:
    content, status = task.result()
    if status == 200:
        print(content)

更新

如果您收到有关使用conn_timeout和read_timeout的弃用警告,请查看THIS参考资料底部附近的内容,了解如何使用ClientTimeout数据结构。根据链接的引用将此数据结构应用于上述原始代码的一种简单方法是:

代码语言:javascript
复制
async def get_http(url):
    timeout = aiohttp.ClientTimeout(total=60)
    async with aiohttp.ClientSession(timeout=timeout) as client:
        try:
            etc.
票数 4
EN

Stack Overflow用户

发布于 2020-04-22 23:20:02

修补文档中的“发送”函数将修复所有请求-即使在许多依赖库和sdk中也是如此。修补lib时,请确保修补支持/文档中的函数,而不是TimeoutSauce -否则您可能会默默地失去补丁的效果。

代码语言:javascript
复制
import requests

DEFAULT_TIMEOUT = 180

old_send = requests.Session.send

def new_send(*args, **kwargs):
     if kwargs.get("timeout", None) is None:
         kwargs["timeout"] = DEFAULT_TIMEOUT
     return old_send(*args, **kwargs)

requests.Session.send = new_send

没有任何超时的影响是相当严重的,使用默认超时几乎不会破坏任何东西-因为TCP本身也有默认超时。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17782142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档