Python SOAP Client-используйте пену или что-то еще?
в настоящее время я изучаю реализацию клиента, который будет использовать существующий обширный API управления SOAP.
Я посмотрел на различные реализации SOAP, такие как pysimplesoap и магазина. В то время как у первого были проблемы с разбором WSDL из-за слишком большого количества рекурсий, suds работал нормально (но медленно), и мне очень нравится модуль.
однако, похоже, есть несколько проблем с пеной, таких как высокое потребление памяти, разбор WSDL скорость и отсутствие поддержки некоторых атрибутов WSDL (например. атрибут выбора).
В то время как есть много людей, активно совершающих сообщения об ошибках и патчи, было нет выхода пены с 0.4 на 2010-09-15. Кроме того, Вики и дорожная карта выглядят немного заброшенными.
для меня это выглядит, как пена больше не поддерживается.
так вот мои вопросы:
- имеет ли смысл основывать более крупный проект на мыльной пене в качестве мыла клиент?
- есть ли вилка suds, которая уже реализует некоторые патчи, доступные в системе продажи билетов?
- какие альтернативы доступны, которые имеют меньший объем памяти и просты в использовании и могут обрабатывать сложные большие файлы WSDL
[Обновление Ноябрь 2013]
прошло более двух лет, и оказалось, что оригинальный проект suds действительно мертв. С 2010 года новых релизов не было. Из-за этого многие люди начали разветвлять suds и дистрибутивы, такие как Debian, развертывают исправленные версии исходного пакета suds, чтобы исправить некоторые проблемы.
Я могу порекомендовать активно поддерживаемую вилку Jurko, которую я успешно использовал. Он поддерживает python 3 и решает множество известных проблем suds. Примечания к выпуску и трекер ошибок доступны на Bitbucket пакет также доступен на PyPI так его можно установить используя очко.
4 ответа:
пока нет сертифицированного стандарта, если вы должны использовать мыло, пена-ваш лучший выбор. Мыльная пена может быть медленной на больших WSDL, и это то, над чем они работают.
в то же время, если вы не ожидаете, что ваш WSDL будет часто меняться, у вас есть два варианта, которые могут купить вам много скорости:
- загрузка вашего WSDL на localhost
- С помощью кэширования
загрузка вашего 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, но я смог заставить его работать.