Перезаписать мыльный конверт на питоне Suds - PullRequest
6 голосов
/ 30 марта 2010

У меня есть камера, и я пытаюсь к ней подключиться. Я попытался отправить необработанный xml и обнаружил, что единственное, что мешает работе xml suds - это некорректное пространство имен конверта Soap.

Пространство имен конверта:

xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"

и я хочу переписать его на:

xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"

Чтобы добавить пространство имен в Python, я пробую этот код:

message = Element('Element_name').addPrefix(p='SOAP-ENC', u='www.w3.org/ENC')

Но когда я добавляю SOAP-ENV к пространству имен, он не записывается, поскольку он жестко закодирован в привязки suds. Есть ли способ перезаписать это в suds?

Спасибо за любую помощь.

Ответы [ 4 ]

5 голосов
/ 29 января 2013

Я справился с этим, вручную переопределив переменную suds.binding.envns в модуле bindings:

from suds.bindings import binding
binding.envns=('SOAP-ENV', 'http://www.w3.org/2003/05/soap-envelope')

С этого момента все идет хорошо (с моей услугой, то есть)

1 голос
/ 03 апреля 2010

Обновление вручную binding.py определенно не правильный путь. Вы должны иметь возможность использовать ImportDoctor для переопределения привязок по умолчанию. Посмотрите документацию по исправлению неисправных схем на сайте Suds.

Кроме того, какие версии Python и suds вы используете?

1 голос
/ 30 марта 2010

Мне удалось заставить это работать, мыльный конверт жестко закодирован в bindings.py, который хранится в suds.egg, установленном в ваших пакетах сайта. Я изменил адрес конверта SOAP на http://www.w3.org/2003/05/soap-envelope. Это было совместимо с моей камерой. Мне не удалось найти команду перезаписать этот конверт в suds, поэтому я жестко закодировал его в bindings.py.

Спасибо за любую помощь

0 голосов
/ 15 апреля 2016
from suds.client import Client
from suds.plugin import MessagePlugin

WSDL_url = "my_url?wsdl"

class MyPlugin(MessagePlugin):
    def marshalled(self, context):
        #print(str(context.envelope))
        context.envelope.nsprefixes['SOAP-ENV']='myText'

client = Client(WSDL_url, plugins=[MyPlugin()])
...