Как указать полное пространство имен для factory.create()

Я использую suds для выполнения запросов SOAP к стороннему API.

import suds.client
client = suds.client.Client(WSDL_URL, location=SERVICE_URL)

Когда я пытаюсь создать объект для определенного типа, определенного WSDL (скажем, TheObject):

obj = client.factory.create('TheObject')

Я получаю ошибку о том, что он не существует:

(TheObject) not-found
path: "TheObject", not-found
Traceback (most recent call last):
  File "suds_test.py", line 67, in <module>
    sys.exit(main(sys.argv))
  File "suds_test.py", line 51, in main
    obj = client.factory.create('TheObject'),
  File "/usr/local/lib/python2.7/dist-packages/suds/client.py", line 234, in create
    raise TypeNotFound(name)
suds.TypeNotFound: Type not found: 'TheObject'

Поэтому я печатаю список доступных типов фабрик пены с print(client):

Suds ( https://fedorahosted.org/suds/ )  version: 0.4 GA  build: R699-20100913

Service ( OrderService ) tns="http://api.example.com/services/"
   Prefixes (2)
      ns0 = "http://api.example.com/contracts/stuff"
      ns1 = "http://api.example.com/services/"
   Ports (2):
      (OrderServiceSoap)
         Methods (123):
            ... Not really relevant
         Types (123):
            SomeType
            SomeType2
            ns0:AnotherType
            ns0:AnotherType2
            ns0:TheObject
            ...

Получается, что ns1 — это пространство имен по умолчанию, а ns0 — это пространство имен, которое я хочу использовать для TheObject. Если я добавлю к нему префикс псевдонима пространства имен, он сработает.

obj = client.factory.create('ns0:TheObject')

Я бы предпочел не помнить об использовании ns0 в этом конкретном случае, потому что он может варьироваться произвольно. Я просмотрел документы для Factory.create(), но он принимает только один аргумент name без дополнительных аргументов для URL-адреса пространства имен или чего-либо еще.

Есть ли способ динамически определить пространство имен для TheObject? Или можно указать полный URL-адрес для ns0 вместо только псевдонима пространства имен? Любая помощь будет оценена по достоинству.


person All Workers Are Essential    schedule 14.02.2014    source источник


Ответы (1)


И мне должно было быть до боли очевидно, что это стандартное пространство имен XML, и это четко указано в документация (которую я пропустил).

Чтобы указать пространство имен по URL-адресу, вы просто добавляете префикс к имени с URL-адресом пространства имен, заключенным в {} (фигурные скобки):

obj = client.factory.create('{http://api.example.com/contracts/stuff}TheObject')
person All Workers Are Essential    schedule 14.02.2014