HTTP requests.post timeout

2020-08-09 10:57发布

问题:

In my code below, I use requests.post. What are the possibilities to simply continue if the site is down?

I have the following code:

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.

How could I make the requests.post timeout, or return from post_test() if example.com, or its /submit app is down?

回答1:

Use the timeout parameter:

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

Note: timeout is not a time limit on the entire response download; rather, an exception is raised if the server has not issued a response for timeout seconds (more precisely, if no bytes have been received on the underlying socket for timeout seconds). If no timeout is specified explicitly, requests do not time out.



回答2:

All requests take a timeout keyword argument. 1

The requests.post is simplify forwarding its arguments to requests.request 2

When the app is down, there is more likelihood of a ConnectionError than a Timeout. 3

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