spyne / soap поставщик веб-услуг: проблемы с переводом WSDL в python код - PullRequest
0 голосов
/ 21 марта 2020

В настоящее время я занимаюсь оценкой 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

...