Python SOAP Client - использовать SUDS или что-то еще? - PullRequest
59 голосов
/ 12 октября 2011

В настоящее время я ищу реализацию клиента, который будет использовать существующий обширный API-интерфейс управления SOAP.

Я рассмотрел различные реализации SOAP, такие как pysimplesoap и SUDS .В то время как у первого были проблемы с синтаксическим анализом WSDL из-за слишком большого количества рекурсий, suds работал нормально (но медленно), и мне действительно нравится модуль.

Тем не менее, есть некоторые проблемы с SUDS, такие как высокое потребление памяти,Скорость синтаксического анализа WSDL и отсутствующая поддержка некоторых атрибутов WSDL (например, атрибут choice).
Несмотря на то, что многие люди активно фиксируют сообщения об ошибках и исправления, с 101 по 2010 г. не было выпущено SUDS.-09-15.Кроме того, вики и дорожная карта выглядят немного заброшенными.

Для меня это выглядит так, как будто SUDS больше не поддерживается.

Итак, мои вопросы:

  1. Имеет ли смысл основыватьбольший проект на suds в качестве мыльного клиента?
  2. Существует ли ветвь suds, в которой уже реализованы некоторые исправления, доступные в системе создания билетов?
  3. Какие доступны альтернативы, которые занимают меньше места в памяти ипросты в использовании и могут обрабатывать сложные большие WSDL-файлы

[обновление ноября 2013 г.]

Прошло более двух лет, и получается, что оригинальные пеныПроект действительно мертв.Больше никаких выпусков с 2010 года не было. Из-за этого многие люди начали использовать suds, а дистрибутивы, такие как Debian, для исправления некоторых проблем используют исправленные версии исходного пакета suds.

Я могу рекомендоватьАктивно поддерживаемая вилка Юрко, которую я успешно использовал.Он поддерживает Python 3 и решает множество известных проблем suds.Примечания к выпуску и отслеживание ошибок доступны на Bitbucket , пакет также доступен на PyPI , поэтому его можно установить с помощью pip.

Ответы [ 4 ]

48 голосов
/ 21 октября 2011

Хотя не существует сертифицированного стандарта, если вы должны использовать SOAP, Suds - ваш лучший выбор. Suds может быть медленным на больших WSDL, и это то, над чем они работают.

Тем временем, если вы не ожидаете, что ваш WSDL будет часто меняться, у вас есть два варианта, которые могут принести вам большую скорость:

  1. Загрузка WSDL на localhost
  2. Использование кеширования

Загрузка вашего WSDL

В случае больших WSDL проблема заключается в том, что сначала вы должны каждый раз загружать WSDL, что может привести к дополнительным расходам. Suds будет загружать и анализировать весь WSDL при запуске, чтобы убедиться, что он не изменился.

Если вы можете загрузить его в локальную систему, а затем передать его конструктору Client, используя схему file:// в URL-адресе. Поскольку Suds использует urllib2 для транспорта HTTP, это вполне законно.

Теперь, поскольку вы не указали имя хоста в своем URL-адресе WSDL, вам также придется передать аргумент location, указывающий фактический URL-адрес приложения SOAP.

Вот пример:

from suds.client import Client

# The service URL
soap_url = 'http://myapp.example.notreal/path/to/soap'

# The WSDL URL, we wont' use this but just illustrating for example. This 
# would be the file you download to your system and save as wsdl_file
wsdl_url = 'http://myapp.example.notreal/path/to/soap?wsdl' 

# The full path to the downloaded WSDL file on your local system
wsdl_file = '/path/to/myapp.wsdl'
wsdl_url = 'file://' + wsdl_file # Override original wsdl_url

client = Client(url=wsdl_url, location=soap_url)

Если вам интересно, я использовал этот подход в своей работе и открыл исходный код .

Кэширование вашего WSDL

Другой вариант - использовать превосходную функцию кэширования от Suds . Вы должны явно создать объект кеша, а затем передать его конструктору, используя аргумент cache. В противном случае по умолчанию используется значение ObjectCache с продолжительностью 1 день.

Вы также можете рассмотреть возможность использования обоих этих подходов.

10 голосов
/ 13 мая 2016

Существует новый ухоженный SOAP-клиент, который называется zeep . Он поддерживает Python 2 и 3 и основан на хорошо известных библиотеках lxml и запросов.

7 голосов
/ 18 октября 2011

Интересную актуальную публикацию можно найти здесь: Какие клиентские библиотеки SOAP существуют для Python и где находится документация для них? К сожалению, идеальной библиотеки SOAP, которую вы ищете, похоже, не существует (пока)

5 голосов
/ 24 мая 2013

Сейчас 2013 год. Это обновление для всех, кто сталкивался с проблемой Python и SOAP, как я.

Я пытался использовать SOAP в Python. Я опробовал suds, но, к сожалению, библиотека не обновлялась с 2010 года. В первом тестовом прогоне моего кода я получил эту ошибку:

RuntimeError: maximum recursion depth exceeded while calling a Python object

Что, по-видимому, является проблемой suds с рекурсивными ссылками на соединения HTTPS. См. Ответ drfence . Мне пришлось вручную исправлять пены, чтобы обойти эту проблему.

Я переключился на php. Не так просто, как Python, но я смог заставить его работать.

...