2009-08-29 19 views
9

SİTE seyahat web servislerini Python Suds ile kullanmaya çalışıyorum, ancak bir XSD iyi biçimlendirilmemiş gibi görünüyor (bu şemada isim alanı eksik).XSD şeması Python Suds (sürüm 0.3.6) SOAP kütüphanesiyle nasıl içe aktarılır: TypeNotFound istisnası?


from suds.client import Client 
wsdl = 'http://webservices.sabre.com/wsdl/sabreXML1.0.00/tpf/OTA_AirPriceLLSRQ.wsdl' 
client = Client(wsdl, cache=None) 

ayıklama iz döner:


.DEBUG:suds.wsdl:reading wsdl at: http://webservices.sabre.com/wsdl/sabreXML1.0.00/tpf/OTA_AirPriceLLSRQ.wsdl ... 
DEBUG:suds.transport.http:opening (http://webservices.sabre.com/wsdl/sabreXML1.0.00/tpf/OTA_AirPriceLLSRQ.wsdl) 
DEBUG:suds.metrics:sax (http://webservices.sabre.com/wsdl/sabreXML1.0.00/tpf/OTA_AirPriceLLSRQ.wsdl) duration: 406 (ms) 
DEBUG:suds.xsd.sxbasic:Import:0x7f90196fd5f0, importing ns="http://webservices.sabre.com/sabreXML/2003/07", location="OTA_AirPriceLLSRQRS.xsd" 
DEBUG:suds.transport.http:opening (http://webservices.sabre.com/wsdl/sabreXML1.0.00/tpf/OTA_AirPriceLLSRQRS.xsd) 
DEBUG:suds.metrics:sax (http://webservices.sabre.com/wsdl/sabreXML1.0.00/tpf/OTA_AirPriceLLSRQRS.xsd) duration: 504 (ms) 
DEBUG:suds.xsd.sxbasic:Include:0x7f90196fdf80, importing ns="None", location="OTA_AirPriceLLSRQ.xsd" 
DEBUG:suds.transport.http:opening (http://webservices.sabre.com/wsdl/sabreXML1.0.00/tpf/OTA_AirPriceLLSRQ.xsd) 
DEBUG:suds.metrics:sax (http://webservices.sabre.com/wsdl/sabreXML1.0.00/tpf/OTA_AirPriceLLSRQ.xsd) duration: 1.363 (seconds) 
DEBUG:suds.xsd.schema:built: 
Schema:0x7f9019708e60 
(...) 
DEBUG:suds.xsd.query:(u'MessageHeader', http://www.ebxml.org/namespaces/messageHeader), found as: 
DEBUG:suds.xsd.query:(u'Security', http://schemas.xmlsoap.org/ws/2002/12/secext), found as: 
DEBUG:suds.xsd.query:(u'OTA_AirPriceRQ', http://webservices.sabre.com/sabreXML/2003/07), not-found 
. 
---------------------------------------------------------------------- 
Ran 2 tests in 11.669s 

Type not found: '(OTA_AirPriceRQ, http://webservices.sabre.com/sabreXML/2003/07,)' 

Bu mantık: Bir "Yok" ad alanında Python Köpük yükler OTA_AirPriceRQ. Python Köpük belgelerine (https://fedorahosted.org/suds/wiki/Documentation#FIXINGBROKENSCHEMAs) "bozuk şema düzeltmek" okuyun:


from suds.client import Client 
from suds.xsd.doctor import ImportDoctor, Import 
wsdl = 'http://webservices.sabre.com/wsdl/sabreXML1.0.00/tpf/OTA_AirPriceLLSRQ.wsdl' 
imp = Import('http://webservices.sabre.com/sabreXML/2003/07/OTA_AirPriceLLSRQ', 'http://webservices.sabre.com/wsdl/sabreXML1.0.00/tpf/OTA_AirPriceLLSRQ.xsd') 
d = ImportDoctor(imp) 
client = Client(wsdl, cache=None, doctor=d) 

Ama senaryo başka istisna dönüş:


.DEBUG:suds.wsdl:reading wsdl at: http://webservices.sabre.com/wsdl/sabreXML1.0.00/tpf/OTA_AirPriceLLSRQ.wsdl ... 
DEBUG:suds.transport.http:opening (http://webservices.sabre.com/wsdl/sabreXML1.0.00/tpf/OTA_AirPriceLLSRQ.wsdl) 
DEBUG:suds.metrics:sax (http://webservices.sabre.com/wsdl/sabreXML1.0.00/tpf/OTA_AirPriceLLSRQ.wsdl) duration: 617 (ms) 
DEBUG:suds.xsd.doctor:inserting: 
DEBUG:suds.xsd.sxbasic:Import:0xe6cf80, importing ns="http://webservices.sabre.com/sabreXML/2003/07/OTA_AirPriceLLSRQ", location="http://webservices.sabre.com/wsdl/sabreXML1.0.00/tpf/OTA_AirPriceLLSRQ.xsd" 
DEBUG:suds.transport.http:opening (http://webservices.sabre.com/wsdl/sabreXML1.0.00/tpf/OTA_AirPriceLLSRQ.xsd) 
DEBUG:suds.metrics:sax (http://webservices.sabre.com/wsdl/sabreXML1.0.00/tpf/OTA_AirPriceLLSRQ.xsd) duration: 1.375 (seconds) 
DEBUG:suds.xsd.doctor:inserting: 
(...) 
Error maximum recursion depth exceeded while calling a Python object 

ben "doktor" işlevlerini nasıl kullanılacağını anlamıyorum. Biri bana yardım edebilir mi lütfen? Teşekkür ederiz.

cevap

3

Sadece Suds biletine bir geçici çözüm gönderdim. Sen bunu kontrol etmek isteyebilirsiniz:

from suds.client import Client 
import sys 
sys.setrecursionlimit(10000) 
c = Client('http://url.to/endpoint?wsdl', cache=None) 
: https://fedorahosted.org/suds/ticket/239#comment:19

Kısaca, burada geçici çözüm kodu