HTTP requests.post 超时

Posted

技术标签:

【中文标题】HTTP requests.post 超时【英文标题】:HTTP requests.post timeout 【发布时间】:2019-07-04 07:35:35 【问题描述】:

在下面的代码中,我使用requests.post。如果站点关闭,有哪些可能继续?

我有以下代码:

def post_test():

    import requests

    url = 'http://example.com:8000/submit'
    payload = 'data1': 1, 'data2': 2
    try:
        r = requests.post(url, data=payload)
    except:
        return   # if the requests.post fails (eg. the site is down) I want simly to return from the post_test(). Currenly it hangs up in the requests.post without raising an error.
    if (r.text == 'stop'):
        sys.exit()  # I want to terminate the whole program if r.text = 'stop' - this works fine.

如果 example.com 或其 /submit 应用程序关闭,我如何使 requests.post 超时或从 post_test() 返回?

【问题讨论】:

【参考方案1】:

使用timeout参数:

r = requests.post(url, data=payload, timeout=1.5)

注意:timeout不是整个响应下载的时间限制; 相反,如果服务器没有发出响应,则会引发异常 timeout 秒(更准确地说,如果没有收到任何字节 timeout 秒的底层套接字)。如果没有指定超时 明确地,请求不会超时。

【讨论】:

您是否仍然确定如果没有明确指定超时,请求不会超时。问题是我试过了,似乎它们会自动超时! 它们不是因为 Python 而超时,而是因为服务器超时,这超出了您的代码的控制范围。【参考方案2】:

所有请求都带有超时关键字参数。 1

requests.post 正在简化将其参数转发给requests.request 2

当应用程序关闭时,ConnectionError 的可能性大于Timeout3

try:
    requests.post(url, data=payload, timeout=5)
except requests.Timeout:
    # back off and retry
    pass
except requests.ConnectionError:
    pass

【讨论】:

以上是关于HTTP requests.post 超时的主要内容,如果未能解决你的问题,请参考以下文章

requests之https/超时处理

Python爬虫requests判断请求超时并重新发送请求

http post by requests

Requests模块简单入门

人生苦短之HTTP协议及Requests库的方法

python+requests——post提交文件