【发布时间】:2011-02-09 21:41:11
【问题描述】:
我有一个基于 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() 异步进行,
但这对我来说就像一个黑客攻击。
这是我所做的一个例子,给你一个想法:
# 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 一起使用。
【问题讨论】:
标签: python soap twisted suds transport