Подтвердить что ты не робот

Клиент SOAP Python - используйте SUDS или что-то еще?

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

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

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

Для меня похоже, что SUDS больше не поддерживается.

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

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

[Обновить ноябрь 2013]

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

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

4b9b3361

Ответ 1

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

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

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

Загрузка 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 день.

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

Ответ 3

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

Ответ 4

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

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

RuntimeError: maximum recursion depth exceeded while calling a Python object

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

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