Квалифицированные формы элементов/атрибутов и неквалифицированные формы с мыльным сервером Spyne

Есть ли способ использовать тип схемы сервера elementFormDefault="unqualified" с сервером Spyne? Теперь все мои испытания заканчиваются результатом ответа метода:

<senv:Envelope xmlns:tns="http://test.com/remoteService/"
xmlns:senv="http://schemas.xmlsoap.org/soap/envelope/">
<senv:Body>
    <tns:testResponse>
        <tns:status>ok</tns:status>
    </tns:testResponse>
</senv:Body>

And generated wsdl fragment with "qualified" elementFormDefault :

<xs:schema targetNamespace="http://test.com/remoteService/" elementFormDefault="qualified"></xs:schema>

Как настроить модель метода или параметров, чтобы получить такой результат:

<senv:Envelope xmlns:tns="http://test.com/remoteService/"
xmlns:senv="http://schemas.xmlsoap.org/soap/envelope/">
<senv:Body>
    <tns:testResponse>
        <status>ok<status>
    </tns:testResponse>
</senv:Body>

My goal is to generate result where child element:

<tns:status>ok</tns:status>

появится без префикса пространства имен - вот так:

<status>ok<status>

person user2358335    schedule 07.05.2013    source источник


Ответы (2)


Если вам интересно, как добавить слушателя в event_manager для method_return_string или для другого события, см. ниже полный пример:

from spyne import Application, rpc, ServiceBase, Iterable, Integer, Unicode

from spyne.protocol.soap import Soap11
from spyne.server.wsgi import WsgiApplication


class HelloWorldService(ServiceBase):
    @rpc(Unicode, Integer, _returns=Iterable(Unicode))
    def say_hello(ctx, name, times):
        for i in range(times):
            yield u'Hello, %s' % name


def on_method_return_string(ctx):
    ctx.out_string[0] = ctx.out_string[0].replace(b'Hello>', b'Good by')

HelloWorldService.event_manager.add_listener('method_return_string', 
                                              on_method_return_string)

application = Application([HelloWorldService], 'spyne.examples.hello.soap',
                          in_protocol=Soap11(validator='lxml'),
                          out_protocol=Soap11())

wsgi_application = WsgiApplication(application)


if __name__ == '__main__':
    import logging

    from wsgiref.simple_server import make_server
    server = make_server('127.0.0.1', 8000, wsgi_application)
    server.serve_forever()

Начиная с Spyne 2.12, это по-прежнему единственный способ удалить пространства имен из переменных ответа.

person FelixEnescu    schedule 13.10.2016

Начиная с версии 2.10, Spyne не поддерживает это.

Патч будет немного волосатым. Звоните по адресу [email protected], если хотите поработать над этим.

Обходным путем может быть удаление префиксов пространств имен вручную из исходящих документов в ловушке method_return_document. Если вам нужно применить то же самое и для входящих документов, вам нужно либо изменить Wsdl в событии document_built, либо использовать мягкую проверку (мягкая проверка не заботится о пространствах имен) или вообще не проверять.

person Burak Arslan    schedule 08.05.2013