2010-03-10 156 views
6

请指导图书馆在蟒蛇中使用肥皂。
现在,我试图用“泡沫”,我无法从服务器响应已了解如何让HTTP头
代码示例:肥皂,Python,泡沫

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

变量“login_res”包含XML的答案,犯规包含HTTP头。但我需要从他们那里获得会话ID。

+0

你是问有关Python库SOAP一般建议,或者是你寻求帮助的泡沫的一个具体方面?请尝试提出具体问题。 – 2010-03-11 14:11:29

回答

4

我想你真的想在Cookie Jar中寻找。

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 

我不确定。我自己仍然是SUDS noob。但这是我的直觉告诉我的。

+0

+1,因为这是在正确的轨道上,假设urllib2(Suds本机使用的开瓶器)在cookies方面表现不错。如果路径中有任何302重定向,则所有投注都将关闭,因为urllib2 + 302重定向了+ cookies = HELL。 – jathanism 2011-04-12 00:16:21

4

Ishpeck的回应是正确的。我只想补充一些关于Suds内部的东西。

suds客户端是urllib2 HTTP开启者之上的一个大型的抽象层。 HTTP客户端,cookiejar,头文件,请求和响应都存储在transport对象中。问题是这个活动没有被缓存或存储在传输内部,也许cookiejar内的cookie不一样,甚至跟踪这些活动有时可能会有问题。

如果你想看看发生了什么事情在调试时,我的建议是把它添加到您的代码:通过打开调试日志记录

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等等,你能看到的所有活动在包括标题,变量,有效载荷,URL等下面执行,这为我节省了大量的时间。

以外的是,如果你真的需要在你的头,以明确地跟踪状态,你将需要创建一个suds.transport.http.HttpTransport对象的自定义子类和部分过载的默认行为,然后传递到Client构造。

这里是一个超级过于简单例子:

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)