【问题标题】:spyne generates bad WSDL/XSD schema for ComplexModels with ComplexModel childrenspyne 为具有 ComplexModel 子项的 ComplexModels 生成错误的 WSDL/XSD 模式
【发布时间】:2013-09-09 16:10:29
【问题描述】:

我正在尝试使用spyne 在 Python 中实现 SOAP 服务。我的客户发送这样的 SOAP 请求:

<ns1:loadServices xmlns:ns1="dummy">
  <serviceParams xmlns="dummy">
    <header>
        <user>foo</user>
        <password>secret</password>
    </header>
  </serviceParams>
</ns1:loadServices>

但我很难将该结构放入 spyne 模型中。

到目前为止,我想出了这个代码:

class Header(ComplexModel):
    __type_name__ = 'header'
    user = Unicode
    password = Unicode


class serviceParams(ComplexModel):
    __type_name__ = 'serviceParams'
    header = Header()


class DummyService(ServiceBase):
    @rpc(serviceParams, _returns=Unicode)
    def loadServices(ctx, serviceParams):
        return '42'

问题在于 spyne 生成和 XSD 是这样的:

...
<xs:complexType name="loadServices">
  <xs:sequence>
    <xs:element name="serviceParams" type="tns:serviceParams" minOccurs="0" nillable="true"/>
  </xs:sequence>
</xs:complexType>
<xs:complexType name="serviceParams"/>
...

这不是我想要的,因为它本质上说“serviceParams”只是一个没有子标签的空标签。

这是 spyne 中的错误吗?还是我错过了什么?

【问题讨论】:

    标签: python soap xsd wsdl spyne


    【解决方案1】:

    原来这行是罪魁祸首:

    header = Header()
    

    应该是:

    header = Header
    

    非常讨厌的行为,很容易被忽视。

    【讨论】:

    • 好吧,我同意这有点容易被忽视,但我会说那是 Python 而不是 Spyne。调用一个类会实例化该类。也许 Spyne 在看到类型标记的实例时会发出警告或其他东西,因为我想不出在应该使用标记本身的地方使用标记实例的有效用例。
    • 是的,我认为这很“讨厌”,因为 spyne 只是默默地忽略了该元素。如果有异常或至少是清晰可见的警告(例如使用警告模块),那将是完全不同的故事。
    • 对。实际上很容易实现。如果您尽快需要,欢迎使用补丁 :) 见:github.com/arskom/spyne/issues/273
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 2010-10-29
    相关资源
    最近更新 更多