Как я могу вернуть файл XML с помощью Spyne?

У меня есть сервер Flask-Spyne (веб-служба), и я хочу вернуть (вернуть клиенту после того, как он спросит) файл XML.

Я хочу сделать это:

  • Я перенесу некоторые вещи из базы данных в XML. (решено)
  • У меня есть этот XML, сохраненный на сервере (веб-сервис), и я хочу отправить его клиенту, когда он спросит. (это проблема)

Есть ли способ, как это сделать?

Вот мой код:

class Service(spyne.Service):
    __service_url_path__ = '/soap';
    __in_protocol__ = Soap11(validator='lxml');
    __out_protocol__ = Soap11();

    @spyne.srpc(DateTime, DateTime, _returns="What to put here?")
    def Function(A,B):
        GetXML(A,B)
        s = open("file.xml");
        return s;

if __name__ == '__main__':
    app.run(host = '127.0.0.1');

Большое спасибо за любую помощь.. :)

ИЗМЕНИТЬ:

Итак, теперь это мой код: (отправка строки)

@spyne.srpc(DateTime, DateTime, _returns=Iterable(Unicode))
    def oracle(A,B):
        GetXML(A,B)
        s = open("file.xml");
        return s

person Michael Sivak    schedule 18.06.2016    source источник
comment
вы должны правильно составить http-ответ с правильным типом mime как 'text/xml, обратитесь к этому, stackoverflow.com/questions/11773348/   -  person Sugam    schedule 18.06.2016
comment
@Sugam Спасибо, попробую   -  person Michael Sivak    schedule 18.06.2016
comment
@Sugam И что мне добавить в _returns?   -  person Michael Sivak    schedule 18.06.2016
comment
да, переменная xml должна содержать вашу строку xml   -  person Sugam    schedule 18.06.2016
comment
@Sugam Подождите, я немного запутался ... :) Не могли бы вы написать мне небольшой код (как должен выглядеть этот оракул определения)?   -  person Michael Sivak    schedule 18.06.2016
comment
Откуда взялся файл Databaze.xml? это тоже сгенерировано Spyne?   -  person Burak Arslan    schedule 19.06.2016


Ответы (1)


Если вы хотите вернуть его как обычную строку внутри документа, вы должны установить тип _return на Unicode.

Если вы хотите вернуть его как XML-документ, вы должны проанализировать его (etree.parse("Databaze.xml")) и вернуть результирующий экземпляр ElementTree. Ваш возвращаемый тип в этом случае должен быть AnyXml.

Также см. эти примеры:

https://github.com/plq/spyne/blob/1f214d102913848cf9d18985d2d75ae1a97375de/examples/response_as_file_dynamic.py

https://github.com/plq/spyne/blob/1f214d102913848cf9d18985d2d75ae1a97375de/examples/response_as_xml_file.py

Отправка в виде строки изолирует ваш документ от родительского контекста. Это немного более неэффективно (например, символ < становится &lt;), но в остальном безвреден.

Отправка в виде документа делает ваш документ частью сообщения SOAP. Это более эффективно, но заставляет наследовать префиксы пространства имен из родительского документа, что может привести к небольшим изменениям в документе, т. е. то, что вы вводите, и то, что вы получаете обратно, может не совпадать байт за байтом (но тем не менее эквивалентно).

Это полностью зависит от варианта использования. Если сомневаетесь, верните как строку.

person Burak Arslan    schedule 19.06.2016
comment
Большое спасибо :). На данный момент я сделал это со строкой. Можете ли вы сказать мне, есть ли разница в отправке строкового или xml-документа? По скорости, по удобству.. :) - person Michael Sivak; 19.06.2016
comment
Итак, если я возвращаю строку, и это хорошо для меня сейчас, и я доволен, это хорошо, и мне не нужно ее менять :) Большое спасибо - person Michael Sivak; 19.06.2016
comment
Извините, что снова прерываю :) Но не могли бы вы написать мне, как это будет выглядеть, если я захочу отправить xml-документ с помощью AnyXml? Я отредактировал свой пост с кодом отправки строки. Спасибо. - person Michael Sivak; 19.06.2016
comment
Я уже ответил на ваш вопрос. Если вы хотите получить другой ответ, вам нужно задать другой вопрос. Или просто читать документы, вы знаете. - person Burak Arslan; 21.06.2016
comment
Хорошо, сделаю.. Спасибо - person Michael Sivak; 21.06.2016