46 votes

Comment puis-je sortir ce que les SUD génèrent / reçoivent?

J'ai le code suivant:

 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
 

mais je reçois 500 erreurs. J'essaie d'envoyer au développeur WSDL le code XML généré et reçu par le biais de fichiers SUD, mais je ne vois pas comment l'exprimer. J'ai consulté la documentation de SUD, mais je n'arrive pas à le trouver: / Est-ce que quelqu'un sait comment sortir le xml brut qui est envoyé et reçu?

72voto

olly_uk Points 3365

SUDS fournit des méthodes pratiques pour y parvenir:

  client.last_sent()
 client.last_received()
 

Ceux-ci devraient vous fournir ce dont vous avez besoin. Je les utilise pour la journalisation des erreurs. La documentation API pour la classe Client doit contenir les informations supplémentaires dont vous avez besoin.

19voto

Damian Points 74

Vous pouvez utiliser MessagePlugin pour faire cela (cela fonctionnera sur le nouveau fork de Jurko où last_sent et last_received ont été supprimés)

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

13voto

Mikko Ohtamaa Points 20940

Suds prend en charge la journalisation interne, comme vous l'avez fait auparavant.

Je suis en train de régler les niveaux d'informations comme vous:

 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)
 

Et j’ai parfois aussi besoin de redéfinir le niveau de journalisation de l’enregistreur racine, en fonction de la structure utilisée dans les appels Suds (Django, Plone). Si le consignateur racine a un seuil de consignation plus élevé, il est possible que les messages de journalisation ne s'affichent jamais (vous ne savez pas exactement comment les hiérarchies de consignateur devraient être classées). Voici un exemple comment remplacer:

 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))
 

6voto

Fernando César Points 21

Pour obtenir uniquement le message généré, cela fonctionne également:

 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)
 

2voto

Dustin Points 795

essayez de changer

 logging.basicConfig(level=logging.INFO)
 

à

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X