example - Python SOAP Client: ¿usa SUDS o algo más?
python suds jurko timeout (4)
Actualmente estoy buscando la implementación de un cliente que utilice una extensa API de administración de SOAP existente.
pysimplesoap diferentes implementaciones de SOAP como pysimplesoap y SUDS . Mientras que el primero tuvo problemas para analizar el WSDL debido a demasiadas recurrencias, la espuma funcionó bien (pero lentamente) y realmente me gusta el módulo.
Sin embargo, parece haber varios problemas con SUDS como el alto consumo de memoria, la velocidad de análisis WSDL y la falta de soporte para algunos atributos WSDL (por ejemplo, atributo de opción).
Si bien hay mucha gente comprometida activamente con informes de fallas y parches, no hubo ningún lanzamiento de SUDS desde 0.4 el 2010-09-15. Además, el wiki y la hoja de ruta se ven un poco descuidados.
Para mí, parece que SUDS ya no se mantiene.
Entonces aquí mis preguntas:
- ¿Tiene sentido basar un proyecto más grande en espuma como un cliente de jabón?
- ¿Hay un tenedor de espuma que ya implemente algunos de los parches disponibles en el sistema de tickets?
- Qué alternativas están disponibles, que tienen un espacio de memoria más bajo y son fáciles de usar, y pueden manejar archivos WSDL grandes y complejos
[Actualización de noviembre de 2013]
Han pasado más de dos años y resulta que el proyecto original de espuma está realmente muerto. No ha habido más lanzamientos desde 2010. Debido a este hecho, mucha gente comenzó a hornear suds y distribuciones como Debian están implementando versiones parcheadas del paquete de espuma original para solucionar algunos de los problemas.
Puedo recomendar el tenedor activamente mantenido de Jurko que utilicé con éxito. Admite python 3 y soluciona muchos de los problemas conocidos de las jabonaduras. Las notas de la versión y el rastreador de errores están disponibles en Bitbucket El paquete también está disponible en PyPI para que pueda instalarse usando pip.
Aquí puede encontrar una publicación actualizada interesante: ¿Qué bibliotecas de cliente SOAP existen para Python, y dónde está la documentación para ellas? Desafortunadamente, la biblioteca SOAP perfecta que está buscando parece no existir (aún)
Es 2013. Esta es una actualización para cualquiera que encuentre el problema con Python y SOAP como yo.
Estaba intentando usar SOAP en Python. Probé suds, pero lamentablemente la biblioteca no se ha actualizado desde 2010. En la primera ejecución de prueba de mi código, recibí este error:
RuntimeError: maximum recursion depth exceeded while calling a Python object
Lo cual resulta ser un problema que suds tiene con las referencias recursivas en las conexiones HTTPS. Vea la respuesta de drfence . Tuve que parchear manualmente la espuma para superar ese problema.
Cambié a php en su lugar. No es tan sencillo como Python, pero pude hacerlo funcionar.
Hay un nuevo cliente SOAP bien mantenido llamado zeep . Es compatible con Python 2 y 3 y se basa en bibliotecas lxml y de solicitudes conocidas.
Si bien no existe un estándar certificado, si debe usar SOAP, Suds es su mejor opción. Los Suds pueden ser lentos en grandes WSDL, y eso es algo en lo que están trabajando.
Mientras tanto, si no espera que su WSDL cambie con frecuencia, tiene dos opciones que le pueden permitir mucha velocidad:
- Descargando su WSDL a localhost
- Usando el almacenamiento en caché
Descargando su WSDL
Con WSDL grandes, parte del problema es que primero debe descargar WSDL cada vez, lo que puede agregar sobrecarga. Suds se tomará el tiempo para descargar y analizar todo el WSDL al inicio para asegurarse de que no haya cambiado.
Si puede descargarlo en el sistema local y luego pasarlo al constructor del Client
utilizando un esquema file://
en la URL. Como Suds usa urllib2
para el transporte HTTP, esto es perfectamente legítimo.
Ahora, como no está proporcionando un nombre de host en su URL WSDL, también deberá pasar un argumento de location
que especifique la URL real de la aplicación SOAP.
Aquí hay un ejemplo:
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 está interesado, he usado este enfoque en mi trabajo y he abierto el código .
Almacenamiento en caché de su WSDL
La otra opción es usar la excelente función de caché de Suds. Debe crear explícitamente un objeto de caché y luego pasarlo al constructor usando el argumento de cache
. De lo contrario, se establece de forma predeterminada en ObjectCache
con una duración de 1 día.
También podría considerar usar ambos enfoques.