从Spyne到Suds

时间:2013-08-01 18:27:55

标签: python soap suds spyne

我正在尝试使用Spyne和Suds的组合(虽然我不是特别使用Suds)来创建一个模块,它充当两个SOAP实体之间的中间人。

有一个连接到服务器S的客户端C调用一个方法M,它返回一个ComplexType,D。同一个数据对象需要由S发送到另一个服务器S1。当然,有一种方法M1,它将D类型作为服务器S1上的参数。我面临的问题是我不能将D发送到S1,而不能转换为Suds识别的类型。

有没有一种聪明的方法可以做到这一点,而不是逐字段地将D的属性从一个“类型”复制到另一个?

3 个答案:

答案 0 :(得分:0)

你可以转换D类型的对象做一个dict并将dict传递给服务方法,Suds采取尊重对象结构的词:https://fedorahosted.org/suds/wiki/Documentation#ComplexArgumentsUsingPythondict

要转换为dict,您可以使用此处的代码:Recursively convert python object graph to dictionary

即:

    D_inst = S.service.M()
    D_dict = to_dict(D_inst)
    S1.service.M1(D_dict)

答案 1 :(得分:0)

您确实可以将传入的对象转换为dicts并将它们传递给suds。但是Spyne已经提供了两种方式对象< ==> dict转换facitilies。

要转换为dict,您可以使用spyne.util.dictdoc

e.g。

from spyne.model.complex import ComplexModel
from spyne.model.primitive import Integer

class B(ComplexModel):
    c = Integer

class A(ComplexModel):
    a = Integer
    b = B 

from spyne.util.dictdoc import get_object_as_dict
print get_object_as_dict(A(a=4, b=B(c=5)), A)
# prints {'a': 4, 'b': {'c': 5}}

get_object_as_dict(A(a=4, b=B(c=5)), A, ignore_wrappers=False)
# prints {'A': {'a': 4, 'b': {'B': {'c': 5}}}}

我希望它有所帮助。

答案 2 :(得分:0)

Suds在解析复杂对象方面存在很大问题。

E.g。

class C(ComplexModel):
    d = Integer

class B(ComplexModel):
    c = Array(C)

class A(ComplexModel):
    a = Integer
    b = B 

在这种情况下,使用get_object_to_dict转换为字典正常运行,但suds无法调用SOAP方法,并因Type not found 'c'而失败。