Django 如何将Soap11 document/literal(body bare)与Spyne一起使用(未考虑SOAPAction)

Django 如何将Soap11 document/literal(body bare)与Spyne一起使用(未考虑SOAPAction),django,web-services,soap,spyne,Django,Web Services,Soap,Spyne,我正在Django1.4中使用Spyne2.11,并试图模拟ApacheAxis1.4Web服务 我的WS-client是suds,我接收的WS-requests没有正文,即参数没有包装在in消息和“SOAPAction”http头中 虽然我明确指定了_operation\u name un srpc decorator和_body\u style='bare',但Spyne无法识别该操作。它仍然尝试从元素的第一个子元素获取操作名 我如何指导spine: 将SOAPHeader作为操作名称考虑在

我正在Django1.4中使用Spyne2.11,并试图模拟ApacheAxis1.4Web服务

我的WS-client是suds,我接收的WS-requests没有正文,即参数没有包装在in消息和“SOAPAction”http头中

虽然我明确指定了_operation\u name un srpc decorator和_body\u style='bare',但Spyne无法识别该操作。它仍然尝试从元素的第一个子元素获取操作名

我如何指导spine:

  • 将SOAPHeader作为操作名称考虑在内
  • 将SOAP Env:Body的第一个子级视为函数/操作参数

  • 我找到了以下解决方案:

    class MySoap11(Soap11):
    
      def decompose_incoming_envelope(self, ctx, message=XmlDocument.REQUEST):
          res = super(MySoap11, self).decompose_incoming_envelope(ctx, message)
          method = ctx.transport.req['HTTP_SOAPACTION']
          method = method.replace('"', '')
          ctx.method_request_string = method
          return res
    
    然后在实例化应用程序时使用“MySoap11”,例如:

    application = Application(..., in_protocol=MySoap11(validator='soft'), ...)
    
    但我仍然必须在sprc decorator中使用_body_style='bare',例如:

    @srpc(
        SomeComplexModel,       # noqa
        _returns=ResponseComplexModel,
        _body_style='bare',
    )
    def myMethod(param):
        ....
    

    这似乎适用于Spyne2.12.11和2.11.0。

    我也尝试了2.12.9。它似乎也有同样的行为。