我正在尝试使用Spyne和Suds的组合(虽然我不是特别使用Suds)来创建一个模块,它充当两个SOAP实体之间的中间人。
有一个连接到服务器S的客户端C调用一个方法M,它返回一个ComplexType,D。同一个数据对象需要由S发送到另一个服务器S1。当然,有一种方法M1,它将D类型作为服务器S1上的参数。我面临的问题是我不能将D发送到S1,而不能转换为Suds识别的类型。
有没有一种聪明的方法可以做到这一点,而不是逐字段地将D的属性从一个“类型”复制到另一个?
答案 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'
而失败。