У меня есть проект, основанный на Twisted, который используется для связи с сетевыми устройствами, и я добавляю поддержку нового поставщика (Citrix NetScaler), API которого является SOAP. К сожалению, поддержка SOAP в Twisted по-прежнему зависит от SOAPpy
, который сильно устарел. На самом деле, что касается этого вопроса (я только что проверил), twisted.web.soap
сама даже не обновлялась за 21 месяц!
Я хотел бы спросить, есть ли у кого-нибудь опыт использования превосходной функциональности асинхронного транспорта Twisted с SUDS. Кажется, что подключение пользовательского транспорта Twisted было бы естественным подходом к SUDS Client.options.transport
, просто мне трудно обдумать это.
Я придумал способ асинхронно вызывать метод SOAP с SUDS, используя 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.