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))
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.
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
'' '