HTTP requests.post timeout

Question:

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?

Asked By: Zorgmorduk

||

Answers:

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.

Answered By: JacobIRR

All requests take a timeout keyword argument. 1

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

When the app is down, a ConnectionError is more likely than a Timeout. 3

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