带有classmodel问题的python django soaplib响应

时间:2013-12-08 11:10:39

标签: python soap xml-namespaces tns soaplib

我在django中运行一个肥皂服务器。

是否可以创建一个soap方法,该方法返回一个没有< {方法名称}响应>< {方法名称}结果>的soaplib类模型实例。标签

例如,这是我的soap服务器代码的一部分:

# -*- coding: cp1254 -*-
from soaplib.core.service import rpc, DefinitionBase, soap
from soaplib.core.model.primitive import String, Integer, Boolean
from soaplib.core.model.clazz import Array, ClassModel 
from soaplib.core import Application
from soaplib.core.server.wsgi import Application as WSGIApplication
from soaplib.core.model.binary import Attachment    


class documentResponse(ClassModel):
    __namespace__ = ""
    msg = String
    hash = String


class MyService(DefinitionBase):
    __service_interface__ = "MyService"


    __port_types__ = ["MyServicePortType"]




    @soap(String, Attachment, String ,_returns=documentResponse,_faults=(MyServiceFaultMessage,)  , _port_type="MyServicePortType"  )
    def sendDocument(self, fileName, binaryData, hash ):

        binaryData.file_name = fileName
        binaryData.save_to_file()


        resp = documentResponse()
        resp.msg = "Saved"
        resp.hash = hash
        return resp

它的响应是这样的:

 <senv:Body>
   <tns:sendDocumentResponse>
     <tns:sendDocumentResult>
      <hash>14a95636ddcf022fa2593c69af1a02f6</hash>
      <msg>Saved</msg>
    </tns:sendDocumentResult>
  </tns:sendDocumentResponse>
</senv:Body>

但我需要这样的回复:

<senv:Body>
   <ns3:documentResponse>
     <hash>A694EFB083E81568A66B96FC90EEBACE</hash>
     <msg>Saved</msg>
  </ns3:documentResponse>
</senv:Body>

为了获得上面提到的第二个响应,我应该采用什么样的配置?

提前致谢。

1 个答案:

答案 0 :(得分:1)

我还没有使用过Python的SoapLib,但在使用.NET soap lib时遇到了同样的问题。仅供参考,在.NET中,这是使用以下装饰器完成的:

[SoapDocumentMethod(ParameterStyle=SoapParameterStyle.Bare)]

我查看了soaplib源代码,但它似乎没有类似的装饰器。我发现的最接近的是_style属性。从代码https://github.com/soaplib/soaplib/blob/master/src/soaplib/core/service.py#L124可以看出 - 使用

@soap(..., _style='document')

它没有附加%sResult标记,但我没有对此进行测试。试试吧,看看它是否按你想要的方式工作。

如果它不起作用,但你仍想得到这种反应,请看Spyne:

http://spyne.io/docs/2.10/reference/decorator.html

它是来自soaplib的一个分支(我认为)并且有_soap_body_style='bare'装饰器,我相信这就是你想要的。