python - 使用 suds SOAP 库进行 HTTP 身份验证的奇怪行为

标签 python suds

我有一个工作的 python 程序,它使用肥皂水通过 SOAP 获取大量数据。 Web 服务是通过分页功能实现的,这样我就可以在每次提取调用时抓取 nnn 行,并在后续调用中抓取下一个 nnn 行。如果我使用如下代码向 HTTP 服务器进行身份验证

client = suds.client.Client(url=url, location=location, username=username, password=password, timeout=timeout)

一切正常。但是,如果我使用以下内容

t = suds.transport.https.HttpAuthenticated(username=username, password=password)
t.handler = urllib2.HTTPBasicAuthHandler(t.pm)
t.urlopener = urllib2.build_opener(t.handler)
client = suds.client.Client(url=url, location=location, timeout=timeout, transport=t) 

它正好适用于 6 次迭代。也就是说,如果我指定每次提取 10 行的提取限制,我将返回 60 行。在第七次获取时,我收到

  File "build/bdist.linux-i686/egg/suds/client.py", line 542, in __call__
  File "build/bdist.linux-i686/egg/suds/client.py", line 602, in invoke
  File "build/bdist.linux-i686/egg/suds/client.py", line 649, in send
  File "build/bdist.linux-i686/egg/suds/client.py", line 698, in failed
AttributeError: 'NoneType' object has no attribute 'read'

有没有人对可能导致这种情况的原因有任何建议。肯定是这种变化导致了问题。我可以来回交换身份验证样式,它是完全可重现的。

我正在运行带有 suds 0.4 的 python 2.6.6。

谢谢

最佳答案

问题似乎是 urllib2.HTTPError 是从较低级别引发的,并且其 fp 属性为 None:

suds.transport.http 中的第 81 行:

except u2.HTTPError, e:
    if e.code in (202,204):
        result = None
    else:
        raise TransportError(e.msg, e.code, e.fp)

该异常最终被传递到 suds.client 中的第 698 行,其中 error.fp.read() 行爆炸了:

def failed(self, binding, error):
    status, reason = (error.httpcode, tostr(error))
    reply = error.fp.read()

我建议猴子修补 suds.SoapClient 类以获取 HTTP 错误代码和消息。在构建 suds.Client 之前添加这些行,然后运行它以查看第 7 次提取引发的 HTTP 错误:

class TestClient(suds.client.SoapClient):
    def failed(self, binding, error):
        print error.httpcode, error.args

suds.client.SoapClient = TestClient

关于python - 使用 suds SOAP 库进行 HTTP 身份验证的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5201037/

相关文章:

python - 使用任意键的 JSON 模式验证

python - suds 脚本失败,出现异常异常 : imported schema failed, 找不到记录器 "suds.xsd.sxbasic"的处理程序

python - 如何在 suds 0.3.6 中添加 http header ?

使用 soaplib(服务器)和 suds(客户端)的 Python soap

Python suds 错误创建对象

java - 使用语言启发式检查

python - 如何在 Scikit-Learn 中绘制超过 10 倍交叉验证的 PR 曲线

python - 从文件中提取单词

python - 您如何预先计算球的轨迹以及它在 Pong 游戏中的终点?

python - 我如何使用 python 的共享点(通过 soap?)?