在python中部署多个Web服务,即多个wsdl文件

时间:2013-11-28 22:48:16

标签: python web-services wsdl spyne

我正在使用基于this example的Spyne在python中创建Web服务。但是,我的所有服务都合并为一个位于http://localhost:8000/?wsdl的wsdl文件。我正在寻找另一种方法来在单个wsdl文件中单独部署每个Web服务,例如 http://localhost:8000/service1/?wsdlhttp://localhost:8000/service2?wsdl

1 个答案:

答案 0 :(得分:6)

Spyne有一个WsgiMounter类:

from spyne.util.wsgi_wrapper import WsgiMounter

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

现在,您可以将wsgi_app传递给您使用与传递WsgiApplication实例相同的Wsgi实现。

您的Wsgi实现也肯定会有类似的功能,您也可以使用它,例如你需要为root请求提供服务而不是空404请求。

可在以下网址找到最新的完整工作示例:https://github.com/plq/spyne/blob/master/examples/multiple_protocols/server.py

请注意,您不能在多个应用程序中使用一个Service类。如果你必须这样做,你可以这样做:

def SomeServiceFactory():
    class SomeService(ServiceBase):
        @rpc(Unicode, _returns=Unicode)
        def echo_string(ctx, string):
            return string
    return SomeService

并对每个SomeServiceFactory()实例使用Application调用。

e.g。

app1 = Application([SomeServiceFactory()], tns=tns,
        in_protocol=Soap11(), out_protocol=Soap11())
app2 = Application([SomeServiceFactory()], tns=tns,
        in_protocol=Soap11(), out_protocol=Soap11())

希望有所帮助。