【问题标题】:Strange behavior from HTTP authentication with suds SOAP library使用 suds SOAP 库的 HTTP 身份验证的奇怪行为
【发布时间】:2011-03-05 01:33:20
【问题描述】:

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

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

一切都很好。但是,如果我使用以下内容

t = suds.transport.https.HttpAuthenticated(用户名=用户名,密码=密码) t.handler = urllib2.HTTPBasicAuthHandler(t.pm) t.urlopener = urllib2.build_opener(t.handler) 客户端 = suds.client.Client(url=url, location=location, timeout=timeout, transport=t)

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

__call__ 中的文件“build/bdist.linux-i686/egg/suds/client.py”,第 542 行 调用中的文件“build/bdist.linux-i686/egg/suds/client.py”,第 602 行 文件“build/bdist.linux-i686/egg/suds/client.py”,第 649 行,在发送中 文件“build/bdist.linux-i686/egg/suds/client.py”,第 698 行,失败 AttributeError:“NoneType”对象没有“读取”属性

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

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

谢谢

【问题讨论】:

  • 这方面有什么进展吗?如果我将错误的身份验证数据传递给构造函数,我会得到相同的错误而不是异常。如果我使用 HttpAuthenticated 连接并将其传递给 suds 客户端构造函数,即使身份验证数据有效,我总是会收到 403 Bad request (invalid authentication)。

标签: python suds


【解决方案1】:

问题似乎是一个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

【讨论】:

  • 在第 7 次执行 fetch 调用时,我收到“401 ('basic auth failed',), None”。如果我将用户名和密码传递给客户端构造函数,则不会收到此类错误。
  • 也许做一个较低级别的 urllib2 调试以确保您的传输/处理程序在第 7 次通过时使用。由于某种原因,Suds 可能会切换回使用其默认传输,当没有提供用户/通行证时会失败。
  • 我使用了您的补丁,但不是print..,而是raise error,一切都按预期工作。谢谢!
猜你喜欢
  • 1970-01-01
  • 2010-12-17
  • 2011-01-01
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多