Spyne - 具有多个目标命名空间的多个服务,returns 404 with WsgiMounter

Spyne - Multiple services with multiple target namespaces, returns 404 with WsgiMounter

我有两个服务是一个应用程序的一部分,HelloAuth,每个服务都有自己的 目标命名空间 ,因此:

from spyne import (
    Application, ServiceBase, rpc,
    Unicode,
)
from spyne.protocol.soap import Soap11
from spyne.server.wsgi import WsgiApplication
from spyne.util.wsgi_wrapper import WsgiMounter
from wsgiref.simple_server import make_server
import logging


class Hello(ServiceBase):
    @rpc(_returns=Unicode)
    def hello(ctx):
        return "Hello, World!"

class Auth(ServiceBase):
    @rpc(_returns=Unicode)
    def authenticate(ctx):
        return "authenticated!"

我可以看到这些服务中的每一个都单独工作正常,像这样:

hello = Application(
    [Hello],
    tns="hello_tns",
    name="hello",
    in_protocol=Soap11(validator="lxml"),
    out_protocol=Soap11(),
)

auth = Application(
    [Auth],
    tns="auth_tns",
    name="auth",
    in_protocol=Soap11(validator="lxml"),
    out_protocol=Soap11(),
)

hello_app = WsgiApplication(hello)
auth_app = WsgiApplication(auth)


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)
    logging.getLogger("spyne.protocol.xml").setLevel(logging.DEBUG)

    server = make_server("0.0.0.0", 8000, hello_app)
    # server = make_server("0.0.0.0", 8000, auth_app)
    server.serve_forever()

我可以在 http://0.0.0.0:8000/?wsdl 中看到 wsdl

但我想将它们作为一个应用程序的一部分一起使用。

this issue on GitHub and 中,有人提到我应该创建两个 spyne.Application 实例并使用 spyne.util.wsgi_wrapper.WsgiMounter 将它们放在一起。所以我做了同样的事情:

wsgi_mounter = WsgiMounter({
    "hello": hello,
    "auth": auth,
})

if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)
    logging.getLogger("spyne.protocol.xml").setLevel(logging.DEBUG)

    server = make_server("0.0.0.0", 8000, wsgi_mounter)
    server.serve_forever()

但现在当我看http://0.0.0.0:8000/?wsdl时,我什么也看不到。服务器代码给我一个 404 错误响应:

$ python server.py
127.0.0.1 - - [09/Apr/2022 12:52:22] "GET /?wsdl HTTP/1.1" 404 0

我该如何解决这个问题?

首先,问题写得真好!谢谢!

如果您希望在同一应用下使用这两项服务,请将它们传递给同一应用:

hello = Application(
    [Hello, Auth],
    tns="hello_tns",
    name="hello",
    in_protocol=Soap11(validator="lxml"),
    out_protocol=Soap11(),
)

使用HTTP时,同一应用下不能使用多个应用URL。

如果您想要在不同的 URLs 下提供服务(这是 WsgiMounter 的用例),您必须像您那样做:

wsgi_mounter = WsgiMounter({
    "hello": hello,
    "auth": auth,
})

但您会在各自的 URL 下找到您的应用:

  • http://localhost:8000/hello/?wsdl
  • http://localhost:8000/auth/?wsdl