5 votes

Comment puis-je obtenir la gestion des réessais avec python zeep? J'utilise une session de réessai de requêtes, mais l'exception n'est pas gérée

Je suis en train d'utiliser zeep. Le service que j'utilise génère des erreurs de délai d'expiration de temps en temps, et je veux utiliser une fonctionnalité de réessay automatique.

Je tente d'utiliser une session de réessay Requests, mais l'exception de délai d'expiration n'est pas capturée et aucun réessay n'est tenté.

J'ai mis en place une session de réessay Requests (ci-dessous) et j'ai configuré l'attribut client de ma classe (actuellement avec une valeur de délai d'expiration pour provoquer des erreurs):

 session = requests_retry_session()
 transport = Transport(session=session,timeout=20,operation_timeout=.001)
 self.client = Client(self.wsdl_url,transport=transport)

...

def requests_retry_session(
        retries=10,
        backoff_factor=0.3,
        status_forcelist=(500, 502, 503, 504),
        session=None,
) -> requests.Session:
    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

Je reçois une requests.exceptions.ReadTimeout (je suppose que cette erreur est la même que celle que j'obtiens en réalité, mais avec un délai de 20s, mes journaux ne sont pas encore assez bons pour en être sûr)

L'exception n'est pas gérée par la session.

Pourquoi?

EDIT : zeep envoie une requête POST quelque part, ce que je n'ai pas trouvé avec mes propres debugging mais en activant les journaux de débogage dans Requests, on le voit.

Le réessay ne fonctionne pas par défaut sur les POST.

https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html

J'ai mis method_whitelist=False pour changer cela, et maintenant je déclenche des réessay.

12voto

Tim Richardson Points 307

Définir method_whitelist=False déclenchera des tentatives de réessais lorsque les POSTs échouent. Soyez prudent; vous devez savoir si des POSTs répétés vers votre point de terminaison sont une mauvaise idée.

Voici un peu de code pour configurer une session de réessai avec requests :

from zeep import Client
from zeep.transports import Transport
import requests
from requests.adapters import HTTPAdapter, Retry

def requests_retry_session(
        retries=5,
        backoff_factor=0.3,
        status_forcelist=(500, 502, 503, 504),
        session=None,**kwargs) -> requests.Session:
    session = session or requests.Session()
    retry = Retry(
        total=retries,
        read=retries,
        connect=retries,
        backoff_factor=backoff_factor,
        status_forcelist=status_forcelist,
        **kwargs
        )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    return session

Et ensuite pour créer une instance du client Zeep qui réessayera en cas d'échec du POST

 session = requests_retry_session(method_whitelist=False)
 transport = Transport(session=session,timeout=30,operation_timeout=30)
 zeep_client = Client(votre_url_wsdl,transport=transport)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X