リモートの WSDL から Zeep Client を構築すると、そのドキュメントとその import が即座に取得されることがあります。Client がすでにサービス記述の読み込みを試みた後にプロキシを設定するのではなく、先に Transport を構成してください。

from requests import Session
from zeep import Client
from zeep.transports import Transport

session = Session()
session.proxies.update({
    "http": "http://proxy.example.net:8080",
    "https": "http://proxy.example.net:8080",
})

transport = Transport(
    session=session,
    timeout=10,
    operation_timeout=30,
)
client = Client(wsdl_url, transport=transport)

wsdl_url はサービス記述の実際の URL です。そのサービスとその import が公開されており、公開プロキシが許可されている場合、HTTP プロキシ一覧がセッションのプロキシ URL の候補を提供します。構成したセッションは後続の SOAP 操作のために生かしておき、その作業が終わったら閉じてください。

Transport.timeout は WSDL と XSD の読み込みを制御します。operation_timeout はサービス操作のために行われる HTTP リクエストを制御します。したがって、Client 構築中のメタデータのタイムアウトは、後でメソッド呼び出しがタイムアウトするのとは別の段階です。

この例では、Requests の環境統合は有効なままです。環境のプロキシ値が明示的に必要な経路と競合する場合は、session.trust_env=False を使い、必要な CA バンドルと認証設定を明示的に指定してください。

初期化がまだ失敗する場合は、インポートされたドキュメントの URL を確認してください。最上位の WSDL は正常に読み込めても、インポートされた schema が別のホスト名や接続先プロトコルを使っていることがあります。

関連記事