6

sudsを使用してSOAP経由で大量のデータを取得しているPythonプログラムが動作しています。Web サービスは、各フェッチ呼び出しでnnn行を取得し、後続の呼び出しで次のnnn行を取得できるように、ページング機能を使用して実装されています。次のようなコードでHTTPサーバーに認証すると

client = suds.client.Client(url=url、場所=場所、ユーザー名=ユーザー名、パスワード=パスワード、タイムアウト=タイムアウト)

すべてがうまく機能します。ただし、次を使用する場合

t = suds.transport.https.HttpAuthenticated(ユーザー名=ユーザー名、パスワード=パスワード)
t.handler = urllib2.HTTPBasicAuthHandler(t.pm)
t.urlopener = urllib2.build_opener(t.handler)
client = suds.client.Client(url=url, 場所=場所, タイムアウト=タイムアウト, トランスポート=t)

正確に6回の反復で機能します。つまり、フェッチごとに 10 行のフェッチ制限を指定すると、60 行が返されます。7回目のフェッチで、私は受け取ります

  ファイル「build/bdist.linux-i686/egg/suds/client.py」、542 行目、__call__ 内
  ファイル「build/bdist.linux-i686/egg/suds/client.py」、602行目、invoke
  ファイル「build/bdist.linux-i686/egg/suds/client.py」、649行目、送信中
  ファイル「build/bdist.linux-i686/egg/suds/client.py」、698行目、失敗
AttributeError: 'NoneType' オブジェクトには属性 'read' がありません

これを引き起こしている可能性があるものについて、誰か提案がありますか。問題を引き起こしているのは間違いなくこの変化です。認証スタイルを前後に入れ替えることができ、完全に再現可能です。

suds 0.4でpython 2.6.6を実行しています。

ありがとう

4

1 に答える 1

10

問題は、anurllib2.HTTPErrorが下位レベルから引き上げられており、そのfp属性がNoneであることにあるようです。

の81行目suds.transport.http

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

その例外は最終的に行698に渡され、suds.clientそこでそのerror.fp.read()行が爆発します。

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

suds.SoapClientHTTPエラーコードとメッセージを取得するために、クラスにモンキーパッチを適用することをお勧めします。を作成する前にこれらの行を追加しsuds.Client、それを実行して、7番目のフェッチで発生するHTTPエラーを確認します。

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

suds.client.SoapClient = TestClient
于 2011-03-07T05:57:00.557 に答える