web-dev-qa-db-ja.com

Python SOAPクライアント-SUDSまたは他の何かを使用しますか?

現在、既存の広範なSOAP管理APIを使用するクライアントの実装を検討しています。

別のSOAP pysimplesoap[〜#〜] suds [〜#〜] のような実装を調べました。再帰が多すぎるため、WSDLは正常に動作しましたが(遅い)、モジュールが本当に好きです。

ただし、SUDSには、高いメモリ消費量、WSDL解析速度、一部のWSDL属性(choice属性など)のサポートの欠落など、いくつかの問題があるようです。
バグレポートとパッチを積極的にコミットしている人はたくさんいますが、2010-09-15の0.4以降、SUDSの リリースなし がありました。また、wikiとロードマップは少し無視されています。

私にとっては、SUDSはもはやメンテナンスされていないようです。

だからここで私の質問:

  1. 大規模なプロジェクトを石鹸クライアントとして泡に基づいて行うことは理にかなっていますか?
  2. チケットシステムで利用可能なパッチのいくつかをすでに実装している泡フォークはありますか?
  3. メモリフットプリントが低く、使いやすく、複雑な大きなWSDLファイルを処理できる代​​替手段があります

[2013年11月更新]

2年以上が経ち、元の泡プロジェクトは本当に死んでいることがわかりました。この事実により、多くの人々が泡を分岐し始め、Debianのようなディストリビューションは元の泡パッケージのパッチを適用したバージョンを展開して、いくつかの問題を修正しています。

Jurkoのアクティブにメンテナンスされているフォークをお勧めします。 python 3をサポートし、多くの泡の既知の問題に対処します。リリースノートとバグトラッカーは Bitbucket で利用可能です。パッケージは PyPI したがって、pipを使用してインストールできます。

61
circus

認定された標準はありませんが、SOAPを使用する必要がある場合は、Sudsが最適です。大規模なWSDLでは、泡が遅くなる可能性があり、それは彼らが取り組んでいるものです。

それまでの間、WSDLが頻繁に変更されることを期待していない場合は、2つのオプションを使用して速度を大幅に向上させることができます。

  1. WSDLをlocalhostにダウンロードする
  2. キャッシングを使用する

WSDLのダウンロード

大規模なWSDLの問題の一部は、最初に毎回WSDLをダウンロードする必要があるため、オーバーヘッドが追加されることです。 Sudsは、起動時にWSDL全体をダウンロードして解析し、変更されていないことを確認するのに時間がかかります。

ローカルシステムにダウンロードし、URLでfile://スキームを使用してClientコンストラクターに渡すことができる場合。 Sudsはurllib2をHTTPトランスポートに使用するため、これは完全に合法です。

ここで、WSDL URLでホスト名を提供していないため、SOAPアプリケーションの実際のURLを指定するlocation引数も渡す必要があります。

以下に例を示します。

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)

興味のある方は、私の仕事でこのアプローチを使用しており、 コードをオープンソース化 しています。

WSDLのキャッシュ

もう1つのオプションは、Sudsの 優れたキャッシング機能 を使用することです。キャッシュオブジェクトを明示的に作成し、cache引数を使用してコンストラクターに渡す必要があります。それ以外の場合、デフォルトは1日のObjectCacheになります。

また、これらのアプローチの両方を使用することを検討することもできます。

49
jathanism

新しいよく維持されたSOAPクライアントは zeep と呼ばれます。これはPython 2と3をサポートし、よく知られたlxmlとライブラリを要求します。

10
chhantyal

興味深い最新の投稿はここにあります: What SOAP Pythonにはクライアントライブラリがあり、ドキュメントはどこにありますか? 残念ながら、 SOAPお探しのライブラリは存在しないようです(まだ)

7
gecco

2013年です。これは、PythonおよびSOAP私のように。

PythonでSOAPを使用しようとしました。泡を試しましたが、残念ながら2010年以降ライブラリが更新されていません。コードの最初のテスト実行で、このエラーが表示されました

RuntimeError: maximum recursion depth exceeded while calling a Python object

これは、sudsがHTTPS接続の再帰的参照で問題になることが判明しました。 drfenceの答えを参照 。この問題を解決するには、手動で泡を修正する必要がありました。

代わりにphpに切り替えました。 pythonほど簡単ではありませんが、動作させることができました。

5
RobotNerd