Как удалить префикс 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>