web-dev-qa-db-fra.com

Implémentation d'une nouvelle tentative pour les demandes dans Python

Comment puis-je implémenter un nombre de tentatives de 5 fois, à 10 secondes d'intervalle lors de l'envoi d'une demande POST à l'aide du package requests. J'ai trouvé plein d'exemples pour les requêtes GET, mais pas post.

C'est ce avec quoi je travaille en ce moment, parfois j'obtiens une erreur 503. J'ai juste besoin d'implémenter une nouvelle tentative si j'obtiens un code HTTP de mauvaise réponse.

for x in final_payload:
    post_response = requests.post(url=endpoint, data=json.dumps(x), headers=headers)

#Email me the error
if str(post_response.status_code) not in ["201","200"]:
        email(str(post_response.status_code))
9
Phil Baines

vous pouvez utiliser urllib3.util.retry module en combinaison avec requests pour avoir quelque chose comme suit:

from urllib3.util.retry import Retry
import requests
from requests.adapters import HTTPAdapter

def retry_session(retries, session=None, backoff_factor=0.3, status_forcelist=(500, 502, 503, 504)):
    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)
    return session

Usage:

session = retry_session(retries=5)
session.post(url=endpoint, data=json.dumps(x), headers=headers)

NB: Vous pouvez également hériter de la classe Retry et personnaliser le comportement de relance et les intervalles de relance.

15
DhiaTN

J'ai constaté que le comportement par défaut des nouvelles tentatives ne s'appliquait pas au POST. Pour ce faire, il a fallu ajouter method_whitelist, par exemple au dessous de:

'' '

def retry_session(retries=5):
    session = Session()
    retries = Retry(total=retries,
                backoff_factor=0.1,
                status_forcelist=[500, 502, 503, 504],
                method_whitelist=frozenset(['GET', 'POST']))

    session.mount('https://', HTTPAdapter(max_retries=retries))
    session.mount('http://', HTTPAdapter(max_retries=retries))

    return session

'' '

2
Giles Knap