Удалить обертку массива ответов в spyne httprpc -> json

Из коробки Spyne, кажется, оборачивает выходное сообщение JSON (P) в массив. С

 out_protocol=JsonP('serviceResp', ignore_wrappers=True),

я получаю ~

    serviceResp([{ ... }]);

С

    out_protocol=JsonP('serviceResp', ignore_wrappers=False),

Он оборачивает его в оболочку Result/Response,

    serviceResp({"appResponse": {"appResult": [{ ... }]);

Я попытался установить _body_style='bare', чтобы увидеть, имеет ли это какой-либо эффект, но получаю сообщение об ошибке, касающееся слишком большого количества параметров функции (??).

     Exception: body_style='bare' can handle at most one function argument.

Я также безуспешно пытался установить _returns= для различных типов.

EDIT1: вот пример кода, который фактически переносит результат в массив. EDIT2: изменен код ниже, чтобы получить более простое сообщение.

import logging
logging.basicConfig(level=logging.DEBUG)
from spyne.application import Application
from spyne.decorator import srpc
from spyne.service import ServiceBase
from spyne.model.primitive import Integer
from spyne.model.primitive import Unicode
from spyne.model.complex import Iterable
from spyne.protocol.http import HttpRpc
from spyne.protocol.json import JsonDocument
from spyne.server.wsgi import WsgiApplication

class HelloWorldService(ServiceBase):
    @srpc(_returns=Unicode)
    def say_hello():
        yield 'Hello, James'

application = Application([HelloWorldService],
    tns='spyne.examples.hello',
    in_protocol=HttpRpc(validator='soft'),
    out_protocol=JsonDocument()
)
if __name__ == '__main__':
    # You can use any Wsgi server. Here, we chose
    # Python's built-in wsgi server but you're not
    # supposed to use it in production.
    from wsgiref.simple_server import make_server
    wsgi_app = WsgiApplication(application)
    server = make_server('0.0.0.0', 8000, wsgi_app)
    server.serve_forever()

http://server/say_hello

["Hello, James"]

Кто-нибудь может объяснить, как удалить оболочку массива из ответа?

-Джеймс


person James Verbunk    schedule 21.07.2016    source источник


Ответы (1)


Ответ после редактирования: ваше обозначение типа возвращаемого значения говорит Unicode, но вы возвращаете массив из str объектов. Верните один объект unicode, а не итерацию строк, и все будет в порядке.


1.

Под капотом у каждого RPC есть один аргумент — объект запроса. В голом режиме вы можете создать этот объект вручную.

Итак, не голый метод, подобный этому:

@rpc(Integer, Unicode, Unicode, DateTime)
def foo(ctx, i, s1, s2, d):
    pass

Становится:

class FooRequest(ComplexModel):
    i = Integer
    s1 = Unicode
    s2 = Unicode
    d = DateTime        

@rpc(FooRequest, _body_style='bare')
def foo(ctx, req):
    pass

В обернутом режиме Spyne делает это автоматически. В голом режиме вы сами по себе.

2.

Spyne не упаковывает ответы в массивы. Если вы посмотрите на соответствующий тест, вы увидите, что фактический результат таков:

some_callback({"i": 42, "s": "foo"});

Возможно, я мог бы помочь вам отследить, откуда берется этот массив, но вы, по-видимому, не более чем средний эмпатически настроенный человек, который задает вопросы Spyne без кода Spyne, так что вы нужно разобраться самому.

person Burak Arslan    schedule 22.07.2016
comment
Выше находится MWE. Он по-прежнему заключает ответ в [ ], и я в недоумении, будучи первым учеником в вашей структуре. - person James Verbunk; 22.07.2016
comment
Еще раз спасибо за обзор Бурак. Я изменил пример кода из spyne.io, чтобы определенно не пытаться возвращать массив, но он все еще делает. :? - person James Verbunk; 23.07.2016
comment
Вы не возвращаетесь, вы уступаете. Это две очень разные вещи. Пожалуйста, старайтесь возвращать вещи и уступать только тогда, когда вы уверены, что вам это нужно. - person Burak Arslan; 24.07.2016
comment
Один выход объекта str означает итерацию с одним элементом. Так что это все еще массив с точки зрения json. - person Burak Arslan; 24.07.2016
comment
Ага, так и получилось! Я даже не думал смотреть на доходность против доходности. Это принятый ответ, спасибо Бурак! - person James Verbunk; 25.07.2016