В настоящее время я занимаюсь оценкой spyne (v2.13.4a0) для образовательного (soap) проекта, помогая этой структуре создать поставщика веб-услуг. Насколько мне известно, имея данный WSDL, он должен быть переведен вручную в соответствующий код python (v3.7)?
Данная схема xml будет (myconsts.csd)
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://myservice.somewhere.net/"
attributeFormDefault="unqualified"
elementFormDefault="unqualified"
targetNamespace="http://myservice.somewhere.net/"
version="1.0”>
<xs:simpleType name=“type01Spec">
<xs:restriction base="tns:token128"/>
</xs:simpleType>
<xs:simpleType name=“type02Spec">
<xs:restriction base="tns:token255"/>
</xs:simpleType>
<xs:simpleType name="token128">
<xs:restriction base="xs:token">
<xs:minLength value="1"/>
<xs:maxLength value="128"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="token255">
<xs:restriction base="xs:token">
<xs:minLength value="1"/>
<xs:maxLength value="255"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
и (myreqresp.xsd)
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://myservice.somewhere.net/"
xmlns:xmime="http://www.w3.org/2005/05/xmlmime"
attributeFormDefault="unqualified"
elementFormDefault="unqualified"
targetNamespace="http://myservice.somewhere.net/"
version="1.0">
<xs:import namespace="http://myservice.somewhere.net/" schemaLocation=“myconsts.xsd"/>
<xs:complexType name=“type01">
<xs:attribute name=“attr01" type="tns:type01Spec" use="required"/>
</xs:complexType>
<xs:complexType name="type02">
<xs:attribute name="attr01" type="tns:type02Spec" use="required"/>
</xs:complexType>
<xs:complexType name="type03" abstract="true">
<xs:attribute name="attr01" type="tns:type01Spec" use="required"/>
<xs:attribute name="attr02" type="tns:type02Spec" use="required"/>
<xs:attribute name="attr03" type=“tns:type01Spec" use="required"/>
<xs:attribute name="attr04" type="tns:type02Spec" use="optional"/>
<xs:attribute name="attr05" type="xs:boolean" use="optional" default="true"/>
<xs:attribute name="attr06" type="xs:boolean" use="optional" default="true"/>
</xs:complexType>
<xs:complexType name="type04">
<xs:complexContent>
<xs:extension base="tns:type03">
<xs:attribute name="attr07" type="xs:boolean" use="optional" default="false"/>
<xs:attribute name="attr08" type="xs:boolean" use="optional" default="false"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="type05">
<xs:sequence>
<xs:element name="attr01" type="tns:type01"/>
<xs:element name="attr02" type="tns:type02" minOccurs="1" maxOccurs="unbounded"/>
<xs:element name="attr03" type="tns:type04"/>
</xs:sequence>
<xs:attribute name="attr04" type="xs:boolean" use="optional" default="true"/>
</xs:complexType>
</xs:schema>
Я пытался перевести их в 'mycommon.py'
xs_schema = dict(
xmlns_xs = 'http://www.w3.org/2001/XMLSchema',
xmlns_tns = 'http://myservice.somewhere.net/',
xmlns_xmime = 'http://www.w3.org/2005/05/xmlmime',
attributeFormDefault = 'unqualified',
elementFormDefault = 'unqualified',
targetNamespace = 'http://myservice.somewhere.net/',
version = '1.0',
xs_import = dict(
namespace = 'http://myservice.somewhere.net/',
schemaLocation = 'myconsts.xsd'
),
)
'myconsts.py'
from spyne.model import Enum
from spyne.model.primitive import UnsignedInteger, UnsignedLong, Unicode, Token
import mycommon as mcmn
tns = mcmn.xs_schema['targetNamespace']
token = Token.customize(__type_name__='token', __namespace__=tns)
token128 = Token.customize(__type_name__='token128', min_length=1, max_length=128, __namespace__=tns)
token255 = Token.customize(__type_name__='token255', min_length=1, max_length=255, __namespace__=tns)
type01Spec = token128.customize(__type_name__='listKeySpec', __namespace__=tns)
type02Spec = token255.customize(__type_name__='objectKeySpec', __namespace__=tns)
и 'myreqresp.py'
from spyne.model.primitive import Boolean
from spyne.model.complex import ComplexModel
import mycommon as mcmn
import myconsts as mcons
tns = mcmn.xs_schema['targetNamespace']
class type01(ComplexModel):
attr01 = mcons.type01Spec.customize(required=True)
__type_name__ = 'type01'
__namespace__ = tns
class type02(ComplexModel):
attr01 = mcons.type02Spec.customize(required=True)
__type_name__ = 'type02'
__namespace__ = tns
class type03(ComplexModel):
attr01 = mcons.type01Spec.customize(required=True)
attr02 = mcons.type02Spec.customize(required=True)
attr03 = mcons.type01Spec.customize(required=True)
attr04 = mcons.type02Spec.customize(required=True)
attr05 = Boolean.customize(default=True, required = False)
attr06 = Boolean.customize(default=True, required = False)
__abstract__ = True
__type_name__ = 'type03'
__namespace__ = tns
Будучи довольно новичком в веб-службах и soap сам, мне интересно, действительно ли код python, созданный до сих пор, делает в любом смысле, в частности, определение требуемых атрибутов и абстрактного класса (type03).
В терминах определения 'type04', как это xml `xs: extension base 'можно перевести на Spyne-Speak?
И определение последовательности xml в 'type05'?
На основании информации, найденной до сих пор на домашней странице Spyne, или обычных подозреваемых на net, Боюсь, я не смогу это использовать. : (
- Sil68