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