Spyne manual指出使用Spyne创建SOAP错误的正确方法是引发spyne.model.fault.Fault
(或您自己的子类)的实例:
@add_metaclass(ComplexModelMeta)
class Fault(ComplexModelBase, Exception):
# ...
我试图理解它为什么是子类ComplexModelBase
。我最初的假设是我声明了我想要进入我的<detail>
子类中SOAP Fault的Fault
元素的元素,如下所示:
class MyApplicationError(Fault):
__namespace__ = 'http://myapplication.com/ns'
_type_info = [
('reason', Unicode),
]
但是,当实际引发此异常时,看起来我必须将普通的dict传递给构造函数的detail
参数。
使用结构化数据集填充detail
的最佳做法是什么?我甚至在我的Fault
子类中声明了这个结构吗?
如果是,我该如何填写?如果没有,为什么Fault
继承ComplexModelBase
?
答案 0 :(得分:2)
Fault(detail={'foo': {'bar': 123}})
将序列化为:
<ns0:Fault xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/">
<faultcode>soap11env:Server</faultcode>
<faultstring>Fault</faultstring>
<faultactor></faultactor>
<detail>
<foo>
<bar>123</bar>
</foo>
</detail>
</ns0:Fault>
您可以在子类中为Fault
编写新的构造函数,以便更容易生成详细信息。 E.g:
class SuperFault(Fault):
def __init__(self, foo, bar):
super(SuperFault, self).__init__('Server.SuperFault', 'E001234',
detail={'SuperFault': {'foo': foo, 'bar': bar}})
请注意,由于某些愚蠢的限制,传递给细节的字典长度必须为1.如果您遇到问题,请提出问题。