Spyne - 具有多个目标命名空间的多个服务,returns 404 with WsgiMounter
Spyne - Multiple services with multiple target namespaces, returns 404 with WsgiMounter
我有两个服务是一个应用程序的一部分,Hello
和 Auth
,每个服务都有自己的 目标命名空间 ,因此:
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
我有两个服务是一个应用程序的一部分,Hello
和 Auth
,每个服务都有自己的 目标命名空间 ,因此:
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