ネットワークデバイスとの通信に使用されるTwistedに基づくプロジェクトがあり、APIがSOAPである新しいベンダー( Citrix NetScaler )のサポートを追加しています。残念ながら、TwistedでのSOAPのサポートはまだに依存していますがSOAPpy
、これはひどく時代遅れです。実際、この質問(私はチェックしたばかりです)の時点では、twisted.web.soap
それ自体は21か月も更新されていません!
Twistedの優れた非同期トランスポート機能をSUDSで利用することについて、誰かが喜んで共有してくれる経験があるかどうかを尋ねたいと思います。カスタムのツイストトランスポートを接続すると、SUDSに自然にフィットするようClient.options.transport
です。頭を包むのに苦労しています。
を利用して、SUDSでSOAPメソッドを非同期的に呼び出す方法を思いついたのですtwisted.internet.threads.deferToThread()
が、これは私にとってはハックのように感じます。
これが私がやったことの例です、あなたにアイデアを与えるために:
# netscaler is a module I wrote using suds to interface with NetScaler SOAP
# Source: http://bitbucket.org/jathanism/netscaler-api/src
import netscaler
import os
import sys
from twisted.internet import reactor, defer, threads
# netscaler.API is the class that sets up the suds.client.Client object
host = 'netscaler.local'
username = password = 'nsroot'
wsdl_url = 'file://' + os.path.join(os.getcwd(), 'NSUserAdmin.wsdl')
api = netscaler.API(host, username=username, password=password, wsdl_url=wsdl_url)
results = []
errors = []
def handleResult(result):
print '\tgot result: %s' % (result,)
results.append(result)
def handleError(err):
sys.stderr.write('\tgot failure: %s' % (err,))
errors.append(err)
# this converts the api.login() call to a Twisted thread.
# api.login() should return True and is is equivalent to:
# api.service.login(username=self.username, password=self.password)
deferred = threads.deferToThread(api.login)
deferred.addCallbacks(handleResult, handleError)
reactor.run()
これは期待どおりに機能しapi.login()
、ブロックするのではなく、呼び出しが完了するまで呼び出しの戻りを延期します。しかし、私が言ったように、それは正しく感じられません。
ヘルプ、ガイダンス、フィードバック、批判、侮辱、または完全な解決策を事前に感謝します。
更新:私が見つけた唯一の解決策はtwisted-sudsです。これは、Twistedで動作するように変更されたSudsのフォークです。