WSDL медленно загружается с SUDS
Мы внедряем новую биллинговую систему с Vindicia. У Vindicia есть отличный wsdl-файл, с помощью которого легко создать модуль. Итак, мы ПАРНИ. Но проблема в том, что SUDS действительно медленно загружает эти wsdl. (В нашем случае это занимает до 2,4 сек).
Вот как я реализовал это с SUDS.
class BaseWSDL(object):
client = None
group = ""
instances = ""
@classmethod
def get_client(cls):
if cls.client is None:
wsdl = 'file://%s/%s.wsdl' % (wsdl_dir, cls.group)
cls.client = Client(url=wsdl, location=host)
setattr(cls, cls.instances.split(":")[1].lower(), cls.client.factory.create(cls.instances))
return cls.client
class Authentication(object):
def __init__(self, client, instances):
self.authentication = client.factory.create(instances)
self.authentication.login = login
self.authentication.password = pw
class BillingPlan(BaseWSDL):
group = "BillingPlan"
instances = "ns2:BillingPlan"
def __init__(self, **kwargs):
super(BillingPlan, self).__init__()
def fetch_all(self):
client = self.get_client()
auth = Authentication(client, "ns2:Authentication")
response = client.service.fetchAll(auth.authentication)
if response[0].returnCode == "200":
plans_dict = {}
for plan in response[1]:
plans_dict[plan.merchantBillingPlanId] = plan
return plans_dict
Но проблема здесь cls.client = Client(url=wsdl, location=settings.VIN_SOAP_HOST)
Берет 2 видит первый раз. Но мы повторно используем тот же объект для нового запроса, и нас беспокоит тот факт, что SUDS не является потокобезопасным.
Поэтому мы искали другое простое решение. И мы обнаружили, что pySimpleSoap намного быстрее.
Но мы получаем рекурсивную ошибку при загрузке wsdl. (какой шов, чтобы быть известной проблемой, есть код TODO, говорящий о рекурсии)
...
File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/helpers.py", line 205, in postprocess_element
postprocess_element(n)
File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/helpers.py", line 188, in postprocess_element
postprocess_element(v)
File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/helpers.py", line 188, in postprocess_element
postprocess_element(v)
File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/helpers.py", line 205, in postprocess_element
postprocess_element(n)
File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/helpers.py", line 188, in postprocess_element
postprocess_element(v)
File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/helpers.py", line 185, in postprocess_element
for k, v in elements.items():
File "/usr/local/lib/python2.7/dist-packages/pysimplesoap/simplexml.py", line 151, in items
return [(key, self[key]) for key in self.__keys]
RuntimeError: maximum recursion depth exceeded while calling a Python object</code>
Поэтому мы ищем решение, которое снизит нагрузку на Wsdl. Будете ли вы рекомендовать кэшировать клиента после его создания? затем повторно использовать это? И это должно быть простым в реализации. Мы бы хотели, чтобы нам не пришлось переопределять все функции.
1 ответ
См. Suds не использует повторно кэшированные WSDL и XSD, хотя я ожидаю, что это
Это было исправлено в том, что я считаю самой поддерживаемой вилкой.