找不到请求的资源“ {spyne.examples.django}”

时间:2019-10-30 09:19:44

标签: django spyne

我正在尝试使用Spyne在Django中开发肥皂服务。我已在Django应用程序中为应用程序“ Hello_world”克隆了spyne,但出现错误。有人可以帮我吗?

我的代码类似于以下代码:

app = Application([HelloWorldService], 'spyne.examples.hello.http',
    in_protocol=HttpRpc(),
    out_protocol=Soap11(),
)

但发生以下错误:

<faultcode>soap11env:Client.ResourceNotFound</faultcode>
<faultstring>Requested resource '{spyne.examples.django}' not found</faultstring>
<faultactor/>

2 个答案:

答案 0 :(得分:1)

没有为根网址定义处理程序:

https://github.com/plq/spyne/blob/b3b3f198b6148a498cdaeda9897307e0c5b1aac1/examples/django/rpctest/urls.py#L40

将输入协议切换到HttpRpc并执行以下操作:

curl -D - localhost:8000/hello_world/

您得到:

<?xml version='1.0' encoding='UTF-8'?>
<soap11env:Envelope xmlns:soap11env="http://schemas.xmlsoap.org/soap/envelope/">
<soap11env:Body>
<soap11env:Fault>
    <faultcode>soap11env:Client.ResourceNotFound</faultcode>
    <faultstring>Requested resource u'{spyne.examples.django}' not found</faultstring>
    <faultactor></faultactor>
</soap11env:Fault>
</soap11env:Body></soap11env:Envelope>

那是因为您没有指定要调用的方法。

该示例中的HelloWorldService定义了say_hello函数。你可以打电话。

curl -D - "localhost:8000/hello_world/say_hello"

现在可以找到方法了,但是由于未经验证的输入传递给了函数,因此您得到了回溯(我将不在此处包括)。

如果您传递所有参数:

curl -D - "localhost:8000/hello_world/say_hello?times=5&name=Fatemeh"

您得到:

    <?xml version='1.0' encoding='UTF-8'?>
    <soap11env:Envelope xmlns:soap11env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tns="spyne.examples.django">
    <soap11env:Body><tns:say_helloResponse>
    <tns:say_helloResult>
        <tns:string>Hello, Fatemeh</tns:string>
        <tns:string>Hello, Fatemeh</tns:string>
        <tns:string>Hello, Fatemeh</tns:string>
        <tns:string>Hello, Fatemeh</tns:string>
        <tns:string>Hello, Fatemeh</tns:string>
    </tns:say_helloResult></tns:say_helloResponse></soap11env:Body></soap11env:Envelope>

您可能希望启用验证以避免Server异常。首先,我们将Mandatory标记添加到输入类型:

    from spyne import M
    class HelloWorldService(Service):
        @rpc(M(Unicode), M(Integer), _returns=Iterable(Unicode))
        def say_hello(ctx, name, times):
            for i in range(times):
                yield 'Hello, %s' % name

然后,我们启用软验证(HttpRpc唯一的验证)

app = Application([HelloWorldService], 'spyne.examples.hello.http',
    in_protocol=HttpRpc(validator='soft'),
    out_protocol=Soap11(),
)

服务器重启后,以下内容:

curl -D - "localhost:8000/hello_world/say_hello"

您得到:

<class 'spyne.model.complex.say_hello'>.name member must occur at least 1 times.

我希望这会有所帮助!

答案 1 :(得分:0)

您可能还需要使用in_protocol Soap11。

from spyne.application import Application
app = Application([HelloWorldService], 'spyne.examples.hello.http',
            in_protocol=Soap11(validator='lxml'),
            out_protocol=Soap11(),
        )

您可以查看参考文献link