우리는 Vindicia와 함께 새로운 청구 시스템을 구현하고 있습니다. Vindicia에는 모듈을 쉽게 만들 수있는 훌륭한 wsdl 파일이 있습니다. 그래서 우리는 SUDS입니다. 하지만 문제는 SUDS가 이러한 wsdl을로드하는 데 실제로 속도가 느리다는 것입니다. (우리의 경우 2.4 초까지 걸립니다.)SUDL로 WSDL로드가 느림
다음은 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가 Thread safe가 아니라는 사실에 우려를 표시합니다.
그래서 우리는 또 다른 간단한 해결책을 찾았습니다. 그리고 우리는 pySimpleSoap이 훨씬 빠르다는 것을 발견했습니다.
그러나 우리는 wsdl의로드 중에 재귀 오류가 발생합니다.
...
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의 부하를 절감하는 솔루션을 찾고 있습니다 (알려진 문제로 솔기하는 재귀 얘기 코드에서 TODO있다). 클라이언트를 만든 후 캐시하는 것이 좋습니다. 재사용할까요? 그리고 구현이 간단해야합니다. 모든 기능을 다시 구현할 필요가 없기를 바랍니다.