Запрашиваемый ресурс "{spyne.examples.django}" не найден - PullRequest
2 голосов
/ 30 октября 2019

Я пытаюсь разработать мыльный сервис в Django, используя Spyne. Я клонировал Spyne для приложения «Hello_world» в приложении Django, но получаю ошибку. Может ли кто-нибудь помочь мне с этим, пожалуйста?

Мои коды похожи на приведенный ниже:

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 ]

1 голос
/ 31 октября 2019

Не определен обработчик для корневого URL:

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

После переключения протокола ввода на HttpRpc и выполнения этого:

curl -D - localhost:8000/hello_world/

Youget:

<?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.

Надеюсь, это поможет!

0 голосов
/ 30 октября 2019

Вам также может понадобиться использовать in_protocol Soap11.

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

Вы можете проверить ссылку ссылка .

...