2010-12-13 90 views
44

J'ai le code suivant:Comment puis-je générer ce que les SUD génèrent/reçoivent?

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 ce que XML est généré et reçu par l'intermédiaire de SUD, au développeur wsdl, mais je n'arrive pas à comprendre comment le générer? J'ai regardé dans la documentation de SUD, mais ne peux pas sembler le trouver:/Est-ce que quelqu'un sait comment produire le xml brut qui est envoyé et reçu?

+0

Vous pouvez utiliser un sniffer, comme Wireshark regarder ce qui est transmis. – jfs

+1

Les deuxième, troisième et quatrième lignes correspondent aux trois lignes correctes pour la sortie du fichier XML. Il doit y avoir un autre problème où. Pouvez-vous vous connecter au fichier WSDL avec l'interpréteur? – chrissygormley

+3

btw Si vous voulez définir le même niveau pour tous ces loggers, vous pouvez utiliser 'logging.getLogger ('suds'). SetLevel (logging.DEBUG)' Tous les loggers qui descendent de ce logger ('suds. *') avoir le même niveau de journalisation. – simao

Répondre

13

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

Je suis en train de niveaux d'information 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 je dois aussi parfois de passer outre le niveau de journalisation de l'enregistreur racine, selon le cadre utilisé sous Suds appelle (Django, Plone). Si le logger racine a un seuil de journalisation plus élevé, les messages de journalisation peuvent ne jamais apparaître (ne savez pas comment les hiérarchies de loggers devraient aller). Voici un exemple comment passer outre:

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

SUDS fournit des méthodes pratiques pour le faire que:

client.last_sent() 
client.last_received() 

Ceux-ci devraient vous fournir ce dont vous avez besoin. Je les utilise pour la journalisation des erreurs. The API doc pour la classe Client devrait avoir des informations supplémentaires dont vous avez besoin.

+8

jurko-sudo 0.4+ n'a pas ces méthodes. voir http://stackoverflow.com/questions/22487165/how-can-i-inspect-what-suds-is-generating-receiving-in-sudo-0-4-1-jurko-5-and?lq=1 –

+9

'print client.last_sent(). Str()' et 'print client.last_received(). Str()' affichera joliment la requête et la réponse XML. –

+0

Eduard est correct - ces méthodes ont été supprimées dans le commit suivant: https://bitbucket.org/jurko/suds/commits/f0034d6826c179625478bc19ae2a39a0b803fc3a –

2

essayez de changer

logging.basicConfig(level=logging.INFO) 

à

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

Pour obtenir que le message généré cela fonctionne aussi:

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

Cela bien sûr seulement obtient le message envoyé au serveur, mais ne l'envoie pas réellement et donc ne peut pas être utilisé pour obtenir la réponse. Encore utile, cependant. – Wodin

17

Vous pouvez utiliser le MessagePlugin pour ce faire (ceci fonctionne 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()]) 
+2

un moyen propre d'attacher context.envelope et context.reply à l'objet client suds? – radtek

+0

@radtek vérifier cela: http://stackoverflow.com/questions/26266847/how-to-get-unparsed-xml-from-a-suds-response-and-best-django-model-field-to-use/ 36733121 # 36733121 –

+0

@GustavoBezerra Un peu tard, mais assez doux, merci – radtek

0

Si vous voulez réduire l'exploitation forestière par 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)