Python SOAP客户端 - 使用SUDS还是其他什么?

时间:2011-10-12 11:49:27

标签: python soap suds

我目前正在研究实现一个将使用现有广泛的SOAP管理API的客户端。

我研究了不同的SOAP实现,如pysimplesoapSUDS。虽然第一个因为递归太多而解析WSDL时遇到问题,但suds工作得很好(但很慢)而且我真的很喜欢模块。

然而,SUDS似乎存在一些问题,例如高内存消耗,WSDL解析速度以及缺少对某些WSDL属性的支持(例如,选择属性)。
虽然有很多人积极提交错误报告和补丁,但自2010-09-15以来,有0.4%的SUDS no release。此外,维基和路线图看起来有点被忽视。

对我而言,看起来SUDS已不再维护。

所以我的问题在这里:

  1. 将更大的项目作为肥皂客户端以suds为基础是否有意义?
  2. 是否有一个suds fork已经实现了票务系统中可用的一些补丁?
  3. 有哪些替代方案可用,内存占用少且易于使用且可处理复杂的大型WSDL文件
  4. [2013年11月更新]

    两年多过去了,原来泡沫项目真的死了。自2010年以来,没有进一步的版本。由于这一事实,很多人开始分支suds,而像Debian这样的发行版正在部署原始suds包的修补版本来解决一些问题。

    我可以推荐Jurko积极维护的叉子,我成功使用了它。它支持python 3并解决了很多泡沫已知的问题。 Bitbucket上提供了发行说明和错误跟踪器,PyPI上也提供了该程序包,因此可以使用pip进行安装。

4 个答案:

答案 0 :(得分:47)

虽然没有经过认证的标准,但如果必须使用SOAP,则Suds是您的最佳选择。大型WSDL上的延迟可能很慢,而这正是他们正在努力的事情。

与此同时,如果您不希望WSDL经常更改,您有两个选项可以为您带来很多速度:

  1. 将WSDL下载到localhost
  2. 使用缓存
  3. 下载您的WSDL

    对于大型WSDL,问题的一部分是首先必须每次都下载WSDL,这会增加开销。 Suds将花时间在启动时下载并解析整个WSDL,以确保它没有更改。

    如果您可以将其下载到本地系统,然后使用URL中的Client方案将其传递给file://构造函数。由于Suds使用urllib2进行HTTP传输,因此这是完全合法的。

    现在,因为您没有在WSDL URL中提供主机名,所以您还必须传递一个location参数,指定SOAP应用程序的实际URL。

    以下是一个例子:

    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)
    

    如果您有兴趣,我在工作中使用了这种方法,并open sourced the code

    缓存您的WSDL

    另一种选择是使用Suds'excellent caching feature。您必须显式创建一个缓存对象,然后使用cache参数将其传递给构造函数。否则,默认为ObjectCache,持续时间为1天。

    您也可以考虑使用这两种方法。

答案 1 :(得分:10)

有一个名为zeep的新维护良好的SOAP客户端。它支持Python 2和3,并且基于众所周知的lxml和请求库。

答案 2 :(得分:7)

可以在此处找到有趣的最新帖子:What SOAP client libraries exist for Python, and where is the documentation for them? 不幸的是,您正在寻找的完美SOAP库似乎不存在(尚未)

答案 3 :(得分:5)

这是2013年。对于遇到像我这样的Python和SOAP问题的人来说,这是一个更新。

我试图在Python中使用SOAP。我试过suds,但遗憾的是自2010年以来该库尚未更新。在我的代码的第一次测试中,我收到了这个错误:

RuntimeError: maximum recursion depth exceeded while calling a Python object

结果是suds与HTTPS连接上的递归引用有关的问题。 See drfence's answer。我不得不手动修补肥皂以解决这个问题。

我转而使用php。不像python那么简单,但我能够让它工作。