Python >> Tutoriel Python >  >> Python Tag >> Requests

Implémentation d'une nouvelle tentative pour les requêtes en Python

vous pouvez utiliser urllib3.util.retry module en combinaison avec requests 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):
    session = session or requests.Session()
    retry = Retry(
        total=retries,
        read=retries,
        connect=retries,
        backoff_factor=backoff_factor,
        method_whitelist=False,
    )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    return session

Utilisation :

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

NB : Vous pouvez également hériter de Retry class et personnalisez le comportement et les intervalles entre les tentatives.


J'ai constaté que le comportement par défaut de Retries ne s'appliquait pas au POST. Pour ce faire, il a fallu ajouter method_whitelist, par ex. ci-dessous :

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