2013-09-09 1 views
0

Я пытаюсь использовать spyne для реализации SOAP-сервиса в Python. Мой клиент отправляет SOAP-запросы следующим образом:spyne генерирует плохую схему WSDL/XSD для ComplexModels with ComplexModel children

<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? Или я чего-то не хватает?

ответ

1

Оказалось, что эта линия была виновницей:

header = Header() 

, что должно быть:

header = Header 

Очень противный поведение и очень легко упустить из виду.

+0

Ну, я согласен, что это легко пропустить, но я бы сказал, что это Python, а не Spyne. Вызов класса реализует этот класс. Возможно, Spyne может выпустить предупреждение или что-то еще, когда он увидит экземпляр маркера типа, поскольку я не могу придумать правильный пример использования для использования экземпляров маркеров, где сами маркеры должны использоваться. –

+0

да, я думаю, что это «противно», потому что spyne просто молча игнорирует элемент. Если возникло исключение или хотя бы четко видимое предупреждение (например, с использованием модуля предупреждений), это будет совершенно другая история. –

+0

Справа. Это довольно просто реализовать на самом деле. Если вам это нужно как можно скорее, патчи приветствуются :) Смотрите: https://github.com/arskom/spyne/issues/273 –

Смежные вопросы