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


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

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

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

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

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

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

[Обновление Ноябрь 2013]

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

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

4 59

4 ответа:

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

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

  1. загрузка вашего WSDL на localhost
  2. С помощью кэширования

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

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

если вы можете загрузить его в локальную систему, а затем передать его в Client конструктор используя file:// схема в URL. Так как пена использует 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'отличная функция кэширования. Вы должны явно создать объект кэша, а затем передать, что к конструктору с помощью

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

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

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

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

RuntimeError: maximum recursion depth exceeded while calling a Python object

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

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