2010-03-10 5 views
6

Bitte beraten Sie Bibliothek für die Arbeit mit Seife in Python.
Nun, ich versuche, „schaum“ zu verwenden, und ich nicht undestand kann, wie get http-Header von Serverantwort
Code-Beispiel:SOAP, Python, Seifenlauge

from suds.client import Client 
url = "http://10.1.0.36/money_trans/api3.wsdl" 
client = Client(url) 
login_res = client.service.Login("login", "password") 

Variable „login_res“ enthalten xml Antwort und doesnt enthalten HTTP-Header . Aber ich muss eine Session-ID von ihnen bekommen.

+0

Stehen Sie für allgemeine Informationen zu Python-Bibliotheken für SOAP zu fragen, oder fragen Sie um Hilfe zu einem bestimmten Aspekte des Schaums? Bitte versuchen Sie spezifische Fragen zu stellen. –

Antwort

4

Ich denke, Sie wollen tatsächlich in das Cookie Jar suchen.

client = Client(url) 
login_res = client.service.Login("login", "password") 
for c in client.options.transport.cookiejar: 
    if "sess" in str(c).lower(): 
     print "Session cookie:", c 

Ich bin mir nicht sicher. Ich bin immer noch ein SUDS-Noob, ich selbst. Aber das sagt mir mein Bauch.

+0

+1, weil dies auf der richtigen Spur ist, vorausgesetzt, dass urllib2 (der von Suds nativ verwendete Öffner) nett mit Cookies spielt. Wenn Sie 302 Weiterleitungen im Pfad haben, sind alle Wetten deaktiviert, da urllib2 + 302 Weiterleitungen + Cookies = HELL. – jathanism

4

Die Antwort von Ishpeck ist auf dem richtigen Weg. Ich wollte nur ein paar Dinge über die Suds Interna hinzufügen.

Der Suds-Client ist eine große Fettabstraktionsschicht über einem HTTP-Öffner von urllib2. Der HTTP-Client, der Cookie-Beitrag, die Header, die Anfrage und die Antworten sind alle im Objekt transport gespeichert. Das Problem ist, dass keine dieser Aktivitäten im Cache zwischengespeichert oder gespeichert wird, außer vielleicht den Cookies innerhalb des Cookiejars, und selbst das Verfolgen dieser Aktivitäten kann manchmal problematisch sein.

Wenn Sie sehen wollen, was auf, wenn das Debuggen geht, mein Vorschlag wäre, dies zu Ihrem Code hinzuzufügen sein:

import logging 
logging.basicConfig(level=logging.INFO) 
logging.getLogger('suds.client').setLevel(logging.DEBUG) 
logging.getLogger('suds.transport').setLevel(logging.DEBUG) 

Suds makes use of the native logging module und so, indem Sie auf die Debug-Protokollierung drehen, erhalten Sie alle Aktivitäten zu sehen darunter durchgeführt werden, einschließlich Header, Variablen, Payload, URLs usw. Das hat mich oft gespart.

Außerhalb dass, wenn Sie wirklich endgültig Zustand auf dem Header müssen verfolgen, Sie gehen zu müssen, eine benutzerdefinierte Unterklasse eines suds.transport.http.HttpTransport Objekt erstellen, und einen Teil des Standardverhaltens überlasten und dann, dass an den Konstruktor übergeben Client .

Hier ist ein Super-over-vereinfachtes Beispiel:

from suds.transport.http import HttpTransport, Reply, TransportError 
from suds.client import Client 

class MyTransport(HttpTransport): 
    # custom stuff done here 

mytransport_instance = MyTransport() 
myclient = Client(url, transport=mytransport_instance) 
Verwandte Themen