Несколько пространств имен в веб-службе spyne SOAP

Я пытаюсь разместить службу SOAP в python3, используя структуру Spyne и этот пример части кода:

class HelloWorldService(ServiceBase):
    @srpc(Unicode, Integer, _returns=Iterable(Unicode))
    def say_hello(name, times):
        for i in range(times):
            yield 'Hello, %s' % name
application = Application([HelloWorldService],
    tns='spyne.examples.hello',
    in_protocol=Soap11(),
    out_protocol=Soap11()
)
if __name__ == '__main__':
    # You can use any Wsgi server. Here, we chose
    # Python's built-in wsgi server but you're not
    # supposed to use it in production.
    from wsgiref.simple_server import make_server
    wsgi_app = WsgiApplication(application)
    server = make_server('0.0.0.0', 8000, wsgi_app)
    server.serve_forever()

Он работает, но использует только одно пространство имен.

tns='spyne.examples.hello'

Я могу определить несколько сервисов в этой строке:

application = Application([HelloWorldService, OtherService1, OtherService2]

Но можно ли определить разные пространства имен для каждой службы? Что-то вроде этого не работает:

tns=['spyne.examples.hello', 'http://other.service1', 'http://other.service2']

person Marduk    schedule 24.05.2016    source источник


Ответы (1)


Для этого вы можете использовать класс WsgiMounter.

from spyne.util.wsgi_wrapper import WsgiMounter

app1 = Application([SomeService], tns=namespace1,
    in_protocol=Soap11(), out_protocol=Soap11())
app2 = Application([SomeOtherService], tns=namespace2,
    in_protocol=Soap11(), out_protocol=Soap11())
wsgi_mounter = WsgiMounter({
    'app1': app1,
    'app2': app2,
})

Затем передайте объект wsgi_mounter вместо wsgi_app в своем коде:

if __name__ == '__main__':
    from wsgiref.simple_server import make_server
    wsgi_mounter = WsgiMounter({
        'app1': app1,
        'app2': app2, 
    })
    server = make_server('0.0.0.0', 8000, wsgi_mounter)
    server.serve_forever()
person Asunez    schedule 27.05.2016