Le Client Python SOAP - utilise des SUDS ou autre chose?

je suis en train d'étudier la mise en œuvre d'un client qui utilisera une API de gestion étendue de SOAP existante.

j'ai regardé dans différentes implémentations de SOAP comme pysimplesoap et SUDS . Alors que le premier avait des problèmes de parsing de la WSDL en raison de trop de récursions, suds travaillé bien (mais lent) et j'aime vraiment module.

cependant, il semble y avoir plusieurs problèmes avec les SUDS comme le la consommation de mémoire élevée, la vitesse de parsing WSDL et le support manquant pour certains attributs WSDL (par ex. le choix de l'attribut).

Alors qu'il y a beaucoup de gens qui commettent activement des rapports de bogue et des correctifs, il y a eu aucune libération de SUDS depuis 0.4 le 2010-09-15. Aussi, le wiki et la feuille de route semblent un peu négligés.

pour moi, il semble que le SUDS n'est plus entretenu.

alors voici mes questions:

  1. est-il logique de baser un projet plus important sur le suds en tant que client de soap?
  2. y a-t-il une fourche suds qui implémente déjà certains correctifs disponibles dans le système de billetterie?
  3. quelles sont les alternatives disponibles, qui ont une empreinte mémoire plus faible et sont faciles à utiliser et peuvent gérer des fichiers WSDL complexes de grande taille

[Mise À Jour Novembre 2013]

plus de deux ans ont passé et il s'avère que le projet original suds est vraiment mort. Il n'y a pas eu d'autres publications depuis 2010. En raison de ce fait, beaucoup de gens ont commencé à chercher des suds et des distributions comme Debian déploient des versions corrigées du paquet original de suds pour corriger certains problèmes.

je peux recommander la fourche activement entretenue de Jurko que j'ai utilisée avec succès. Il supporte python 3 et s'adresse à beaucoup de suds problèmes connus. Des notes de version et un traceur de bogues sont disponibles sur Bitbucket le paquet est également disponible sur PyPI de sorte qu'il peut être installé en utilisant pip.

59
demandé sur the Tin Man 2011-10-12 15:49:27

4 réponses

bien qu'il n'y ait pas de norme certifiée, si vous devez utiliser du savon, Suds est votre meilleur choix. Les mmuuu peuvent être lents sur les grands Mmuuu, et c'est une chose sur laquelle ils travaillent.

dans l'intervalle, si vous ne vous attendez pas à ce que votre WSDL change souvent, vous avez deux options qui peuvent vous acheter beaucoup de vitesse:

  1. télécharger votre WSDL vers localhost
  2. utilisant la mise en cache

Télécharger votre WSDL

avec wsdls grande partie du problème est que d'abord, vous devez télécharger la WSDL à chaque fois, ce qui peut ajouter au-dessus. Suds prendra le temps de télécharger et d'analyser l'ensemble de la WSDL au démarrage pour s'assurer qu'elle n'a pas changé.

si vous pouvez le télécharger sur le système local et le passer ensuite au constructeur Client en utilisant un schéma file:// dans l'URL. Depuis Suds utilise urllib2 pour le HTTP de transport, ce qui est parfaitement légitime.

maintenant, parce que vous ne fournissez pas de nom d'hôte dans votre URL WSDL, vous devrez aussi passer un argument location spécifiant L'URL réelle de l'application SOAP.

voici un exemple:

from suds.client import Client

# The service URL
soap_url = 'http://myapp.example.notreal/path/to/soap'

# The WSDL URL, we wont' use this but just illustrating for example. This 
# would be the file you download to your system and save as wsdl_file
wsdl_url = 'http://myapp.example.notreal/path/to/soap?wsdl' 

# The full path to the downloaded WSDL file on your local system
wsdl_file = '/path/to/myapp.wsdl'
wsdl_url = 'file://' + wsdl_file # Override original wsdl_url

client = Client(url=wsdl_url, location=soap_url)

si vous êtes intéressé, j'ai utilisé cette approche dans mon travail et ai source ouverte le code .

"1519180920 la mise en Cache" de votre WSDL

l'autre option est D'utiliser le de Suds" excellent caching feature . Vous devez explicitement créer un objet cache et ensuite le passer au constructeur en utilisant l'argument cache . Dans le cas contraire, il s'agit par défaut d'un ObjectCache d'une durée de 1 jour.

vous pourriez également envisager d'utiliser ces deux approches.

46
répondu jathanism 2011-10-21 17:23:28

il y a un nouveau client de savon bien entretenu appelé zeep . Il supporte à la fois Python 2 et 3 et est basé sur des bibliothèques lxml et requests bien connues.

9
répondu chhantyal 2016-05-13 10:42:54

un post intéressant et à jour peut être trouvé ici: quelles bibliothèques de clients SOAP existent pour Python, et où est la documentation pour eux? Malheureusement, la bibliothèque SOAP parfaite que vous recherchez ne semble pas exister (encore)

7
répondu gecco 2017-05-23 10:31:35

on est en 2013. Ceci est une mise à jour pour quiconque a rencontré le problème avec Python et SOAP comme moi.

j'essayais d'utiliser du savon en Python. J'ai essayé des suds, mais malheureusement la bibliothèque n'a pas été mise à jour depuis 2010. Lors du premier essai de mon code, j'ai reçu cette erreur:

RuntimeError: maximum recursion depth exceeded while calling a Python object

qui s'avère être un problème suds A avec des références récursives sur les connexions HTTPS. voir la réponse de drfence . J'ai eu à patch Suds manuellement pour passer ce problème.

j'ai opté pour php à la place. Pas aussi simple que python, mais j'ai réussi à le faire fonctionner.

5
répondu RobotNerd 2017-05-23 11:47:01