如何输出SUD正在生成/接收的内容?

alf*_*edo 46 python xml soap suds

我有以下代码:

from suds.client import Client
import logging

logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
logging.getLogger('suds.xsd.schema').setLevel(logging.DEBUG)
logging.getLogger('suds.wsdl').setLevel(logging.DEBUG)

SB_PRIVATE_ACCESS = {"PATH":"https://thisurl.com:443/services/",}

client = Client(SB_PRIVATE_ACCESS['PATH'])
print client
Run Code Online (Sandbox Code Playgroud)

但我得到了500个错误.我试图通过SUD将生成和接收的XML发送给wsdl开发人员,但我无法想出如何输出它?我一直在查看SUD的文档,但似乎无法找到它:/有谁知道如何输出发送和接收的原始xml?

oll*_*_uk 72

SUDS提供了一些方便的方法:

 client.last_sent()
 client.last_received()
Run Code Online (Sandbox Code Playgroud)

这些应该为您提供所需的一切.我用它们进行错误记录. Client类的API文档应该包含您需要的任何额外信息.

  • jurko-sudo 0.4+没有这些方法.见http://stackoverflow.com/questions/22487165/how-can-i-inspect-what-suds-is-generating-receiving-in-sudo-0-4-1-jurko-5-and?lq=1 (11认同)
  • `print client.last_sent().str()`和`print client.last_received().str()`将打印XML请求和响应. (11认同)

Dam*_*ian 19

您可以使用MessagePlugin执行此操作(这将适用于已删除last_sent和last_received的较新Jurko fork)

from suds.plugin import MessagePlugin

class LogPlugin(MessagePlugin):
  def sending(self, context):
    print(str(context.envelope))
  def received(self, context):
    print(str(context.reply))

client = Client("http://localhost/wsdl.wsdl", plugins=[LogPlugin()])
Run Code Online (Sandbox Code Playgroud)

  • 任何干净的方法将context.envelope和context.reply附加到suds客户端对象? (2认同)

Mik*_*maa 13

正如您所做的那样,Suds支持内部日志记录.

我正在设置像你这样的信息级别:

logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG) # MUST BE THIS?
logging.getLogger('suds.xsd.schema').setLevel(logging.DEBUG)
logging.getLogger('suds.wsdl').setLevel(logging.DEBUG)
logging.getLogger('suds.resolver').setLevel(logging.DEBUG)
logging.getLogger('suds.xsd.query').setLevel(logging.DEBUG)
logging.getLogger('suds.xsd.basic').setLevel(logging.DEBUG)
logging.getLogger('suds.binding.marshaller').setLevel(logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)

我有时还需要覆盖根记录器日志记录级别,具体取决于在Suds调用(Django,Plone)下使用的框架.如果根记录器具有更高的日志记录阈值,则可能永远不会出现日志标记(不确定记录器层次结构应该如何).以下是如何覆盖的示例:

def enableDebugLog(self):
    """ Enable context.plone_log() output from Python scripts """
    import sys, logging
    logger = logging.getLogger()        
    logger.root.setLevel(logging.DEBUG)
    logger.root.addHandler(logging.StreamHandler(sys.stdout))
Run Code Online (Sandbox Code Playgroud)


Fer*_*sar 6

要仅获取生成的消息,这也有效:

from suds.client import Client
import sys

SB_PRIVATE_ACCESS = {"PATH":"https://thisurl.com:443/services/",}

client = Client(SB_PRIVATE_ACCESS['PATH'])

client.set_options(nosend=True)

resp = ...<invoke client here>...

sys.stdout.buffer.write(resp.envelope)
Run Code Online (Sandbox Code Playgroud)