web-dev-qa-db-ja.com

生成/受信しているSUDを出力するにはどうすればよいですか?

私は次のコードを持っています:

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を出力する方法を知っている人はいますか?

46
alfredo

SUDSには、それを行うための便利なメソッドがいくつか用意されています。

 client.last_sent()
 client.last_received()

これらは必要なものを提供するはずです。エラーログに使用します。 APIドキュメント クライアントクラスには、必要な追加情報が必要です。

70
olly_uk

MessagePluginを使用してこれを行うことができます(これは、last_sentとlast_receivedが削除された新しいJurkoフォークで動作します)

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()])
19
Damian

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))
13
Mikko Ohtamaa

生成されたメッセージのみを取得するには、これも機能します。

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)
6
Fernando César

変えてみて

logging.basicConfig(level=logging.INFO)

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

私はbingads APIを使用してこの問題に遭遇しました。順序を記録する必要があることに注意してください.

インポートの順序を確認し、ロギングステートメントを移動すると、問題が解決する場合があります。

0
Oly

Jurko-sudsによるロギングを削減したい場合

 logging.basicConfig(level=logging.INFO)

    logging.getLogger('suds.client').setLevel(logging.INFO)
    logging.getLogger('suds.transport').setLevel(logging.INFO) 
    logging.getLogger('suds.xsd.schema').setLevel(logging.INFO)
    logging.getLogger('suds.wsdl').setLevel(logging.INFO)
    logging.getLogger('suds.resolver').setLevel(logging.INFO)
    logging.getLogger('suds.xsd.query').setLevel(logging.INFO)
    logging.getLogger('suds.xsd.sxbasic').setLevel(logging.INFO)
    logging.getLogger('suds.xsd.sxbase').setLevel(logging.INFO)
    logging.getLogger('suds.metrics').setLevel(logging.INFO)
    logging.getLogger('suds.binding.marshaller').setLevel(logging.INFO)
0
Alex Punnen