2009-08-29 20 views
9

Tôi đang cố gắng sử dụng các dịch vụ web du lịch SABER với Python Sud, nhưng một XSD có vẻ không được định dạng tốt (có thể không gian tên bị thiếu trong lược đồ này).Làm thế nào để nhập giản đồ XSD với Python Suds (phiên bản 0.3.6) Thư viện SOAP: Ngoại lệ TypeNotFound?


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

gỡ lỗi dấu vết trở lại:


.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,)' 

Đó là logic: Python bọt tải OTA_AirPriceRQ trong một "Không" không gian tên. tôi đọc "sửa chữa schema vỡ" Python bọt tài liệu (https://fedorahosted.org/suds/wiki/Documentation#FIXINGBROKENSCHEMAs):


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) 

Nhưng kịch bản trở ngoại lệ khác:


.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 

Tôi không hiểu làm thế nào để sử dụng "bác sĩ" chức năng. Ai đó có thể giúp tôi, làm ơn? Cảm ơn bạn.

Trả lời

3

Tôi vừa đăng giải pháp cho vé Suds đó. Bạn có thể muốn kiểm tra xem nó ra: https://fedorahosted.org/suds/ticket/239#comment:19

Tóm lại, đây là đoạn code workaround:

from suds.client import Client 
import sys 
sys.setrecursionlimit(10000) 
c = Client('http://url.to/endpoint?wsdl', cache=None) 
Các vấn đề liên quan