Как удалить префикс e: из библиотеки Spyne?


from spyne.application import Application
from spyne.decorator import rpc
from spyne.model.complex import ComplexModel
from spyne.model.primitive import String, Integer
from spyne.service import ServiceBase
from spyne.protocol.soap import Soap11
from spyne.server.django import DjangoApplication
from spyne import Unicode
from django.views.decorators.csrf import csrf_exempt
from lxml import etree

class StatusData(ComplexModel):
    date = String

class AppealsExternalStatusRequest(ComplexModel):
    messageId = String

class DataWrapper(ComplexModel):
    AppealsExternalStatusRequest = AppealsExternalStatusRequest


class AppealsService(ServiceBase):
    @rpc(DataWrapper, _returns=String, _body_style='bare', _operation_name='data')
    def receive_status(ctx, data_wrapper):
        print(data_wrapper)
        return "Received"


soap_app = Application([AppealsService],
                        tns='certain_path,
                        in_protocol=Soap11(validator='lxml'),
                        out_protocol=Soap11())

django_soap_app = DjangoApplication(soap_app)
django_soap_app = csrf_exempt(django_soap_app)

Когда я пытаюсь получить доступ к этому через http://localhost/soap_api?wsdl, я получаю в таком формате:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v1="path" xmlns:e="app.soap_service">
   <soapenv:Header/>
   <soapenv:Body>
      <v1:data>
         <e:AppealsExternalStatusRequest>
            <!--Optional:-->
            <e:messageId>?</e:messageId>
            <e:statusData>
               <!--Optional:-->
               <e:date>?</e:date>
               <!--Optional:-->
            </e:statusData>
         </e:AppealsExternalStatusRequest>
      </v1:data>
   </soapenv:Body>
</soapenv:Envelope>


Но я хочу удалить эти префиксы e:, как это возможно?

Я добавил namespace в этом случае, он добавляет просто другие префиксы, а когда я удаляю namespace, он добавляет e: префиксы.

Вот возможное решение с его объяснением.

from spyne.application import Application
from spyne.decorator import rpc 
from spyne.model.complex import ComplexModel
from spyne.model.primitive import String
from spyne.service import ServiceBase
from spyne.protocol.soap import Soap11
from spyne.server.django import DjangoApplication
from django.views.decorators.csrf import csrf_exempt

class StatusData(ComplexModel):
    __namespace__ = None  # Disables namespaces for this model
    date = String

class AppealsExternalStatusRequest(ComplexModel):
    __namespace__ = None  # Disables namespaces for this model
    messageId = String
    statusData = StatusData  # Explicitly declare nested model

class DataWrapper(ComplexModel):
    __namespace__ = None  # Disables namespaces for this model  
    AppealsExternalStatusRequest = AppealsExternalStatusRequest

class AppealsService(ServiceBase):
    @rpc(DataWrapper, _returns=String, _body_style='bare', _operation_name='data')
    def receive_status(ctx, data_wrapper):
        print(data_wrapper)
        return "Received"

soap_app = Application(
    [AppealsService],
    tns='certain_path',  
    in_protocol=Soap11(validator='lxml'),
    out_protocol=Soap11()
)

django_soap_app = DjangoApplication(soap_app)
django_soap_app = csrf_exempt(django_soap_app)

После этих изменений ваш WSDL вывод должен выглядеть так:

<soapenv:Body>
   <v1:data>
      <AppealsExternalStatusRequest>
         <!--Optional:-->
         <messageId>?</messageId>
         <statusData>
            <!--Optional:-->
            <date>?</date>
         </statusData>
      </AppealsExternalStatusRequest>
   </v1:data>
</soapenv:Body>

Вернуться на верх