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

时间:2010-12-13 06:03:48

标签: 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

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

7 个答案:

答案 0 :(得分:70)

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

 client.last_sent()
 client.last_received()

这些应该为您提供所需的一切。我用它们进行错误记录。 Client The API doc应该有您需要的任何额外信息。

答案 1 :(得分: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()])

答案 2 :(得分: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)

我有时还需要覆盖根记录器日志记录级别,具体取决于在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))

答案 3 :(得分: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)

答案 4 :(得分:2)

尝试更改

logging.basicConfig(level=logging.INFO)

logging.basicConfig(filename="/tmp/suds.log", level=logging.DEBUG)

答案 5 :(得分:0)

如果您想通过jurko-suds减少日志记录

$focus

答案 6 :(得分:0)

我使用bingads API遇到了这个问题,值得注意的是顺序很重要我必须导入日志记录然后导入suds开始记录然后导入bingads,任何其他顺序并且没有从suds输出日志。

请检查您的导入订单,并移动您的日志记录,这可能会解决您的问题。