我有一个基于 Twisted 的项目,用于与网络设备通信,我正在添加对API 为 SOAP的新供应商 ( Citrix NetScaler ) 的支持。不幸的是,Twisted 中对 SOAP 的支持仍然依赖于SOAPpy
已经严重过时的 . 事实上,截至这个问题(我刚刚检查过),twisted.web.soap
它本身甚至在 21 个月内都没有更新!
我想问是否有人愿意分享使用 Twisted 出色的异步传输功能和 SUDS 的经验。似乎插入自定义的 Twisted 传输将很自然地适合 SUDS' Client.options.transport
,我只是很难把头绕在它周围。
我确实想出了一种使用 SUDS 异步调用 SOAP 方法的方法twisted.internet.threads.deferToThread()
,但这对我来说就像是一个 hack。
这是我所做的一个例子,给你一个想法:
# 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,它是 Suds 的一个分支,经过修改后可以与 Twisted 一起使用。