web-dev-qa-db-fra.com

Délai d'expiration HTTP requests.post

Dans mon code ci-dessous, j'utilise requests.post. Quelles sont les possibilités de continuer simplement si le site est en panne?

J'ai le code suivant:

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.

Comment puis-je faire expirer le délai request.post ou revenir de post_test () si example.com ou que son application/submit est en panne?

14
Zorgmorduk

Utilisez le paramètre timeout:

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

Remarque: timeout n'est pas une limite de temps pour le téléchargement de la réponse entière; une exception est plutôt levée si le serveur n'a pas émis de réponse pendant timeout secondes (plus précisément, si aucun octet n'a été reçu sur le socket sous-jacent pendant timeout secondes). Si aucun délai d'expiration n'est spécifié explicitement, les demandes n'expirent pas.

22
JacobIRR

Toutes les demandes prennent un argument de mot-clé de délai d'attente. 1

Le requests.post simplifie la transmission de ses arguments à requests.request 2

Lorsque l'application est arrêtée, il y a plus de chances d'avoir un ConnectionError qu'un Timeout

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