tornado.httpclient — 非同期 HTTP クライアント¶
ブロッキングとノンブロッキングの HTTP クライアントインターフェース。
このモジュールは、simple_httpclient と curl_httpclient の 2 つの実装で共有される共通インターフェースを定義します。アプリケーションは、選択した実装クラスを直接インスタンス化するか、このモジュールの AsyncHTTPClient クラスを使用できます。このクラスは、AsyncHTTPClient.configure メソッドでオーバーライドできる実装を選択します。
デフォルトの実装は simple_httpclient で、ほとんどのユーザーのニーズに適していると考えられます。ただし、次のような理由で curl_httpclient に切り替えたいアプリケーションもあるかもしれません。
curl_httpclientには、HTTP プロキシのサポートや指定されたネットワークインターフェースを使用する機能など、simple_httpclientには見られない機能がいくつかあります。curl_httpclientは、HTTP 仕様に完全には準拠していないサイトや、HTTP のあまり使われていない機能を使用するサイトとの互換性が高い可能性があります。curl_httpclientの方が高速です。
curl_httpclient を使用している場合は、最新バージョンの libcurl と pycurl を使用することを強くお勧めします。現在、サポートされている libcurl の最小バージョンは 7.22.0 で、pycurl の最小バージョンは 7.18.2 です。 libcurl のインストールは、非同期 DNS リゾルバー (スレッドまたは c-ares) を使用してビルドすることを強くお勧めします。そうしないと、リクエストのタイムアウトに関するさまざまな問題が発生する可能性があります (詳細については、http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTCONNECTTIMEOUTMS と curl_httpclient.py のコメントを参照してください)。
curl_httpclient を選択するには、起動時に AsyncHTTPClient.configure を呼び出します。
AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient")
HTTP クライアントインターフェース¶
- class tornado.httpclient.HTTPClient(async_client_class: Optional[Type[AsyncHTTPClient]] = None, **kwargs: Any)[source]¶
ブロッキング HTTP クライアント。
このインターフェースは、同期アプリケーションと非同期アプリケーション間でコードを共有しやすくするために提供されています。
IOLoopを実行しているアプリケーションは、代わりにAsyncHTTPClientを使用する必要があります。典型的な使用例は次のようになります。
http_client = httpclient.HTTPClient() try: response = http_client.fetch("http://www.google.com/") print(response.body) except httpclient.HTTPError as e: # HTTPError is raised for non-200 responses; the response # can be found in e.response. print("Error: " + str(e)) except Exception as e: # Other errors are possible, such as IOError. print("Error: " + str(e)) http_client.close()
バージョン 5.0 で変更:
asyncioの制限により、IOLoopの実行中に同期HTTPClientを使用できなくなりました。代わりにAsyncHTTPClientを使用してください。- fetch(request: Union[HTTPRequest, str], **kwargs: Any) HTTPResponse[source]¶
HTTPResponseを返して、リクエストを実行します。リクエストは、文字列 URL または
HTTPRequestオブジェクトのいずれかです。文字列の場合、追加の kwargs を使用してHTTPRequestを構築します:HTTPRequest(request, **kwargs)フェッチ中にエラーが発生した場合、
raise_errorキーワード引数が False に設定されていない限り、HTTPErrorを発生させます。
- class tornado.httpclient.AsyncHTTPClient(force_instance: bool = False, **kwargs: Any)[source]¶
ノンブロッキング HTTP クライアント。
使用例
async def f(): http_client = AsyncHTTPClient() try: response = await http_client.fetch("http://www.google.com") except Exception as e: print("Error: %s" % e) else: print(response.body)
このクラスのコンストラクタは、いくつかの点で特殊です。実際には、実装固有のサブクラスのインスタンスを作成し、インスタンスは擬似シングルトン (
IOLoopごとに 1 つ) の一種として再利用されます。キーワード引数force_instance=Trueを使用すると、このシングルトン動作を抑制できます。force_instance=Trueを使用しない限り、AsyncHTTPClientコンストラクタに引数を渡すべきではありません。実装サブクラスと、そのコンストラクタへの引数は、静的メソッドconfigure()で設定できます。すべての
AsyncHTTPClient実装は、defaultsキーワード引数をサポートしています。これは、HTTPRequest属性のデフォルト値を設定するために使用できます。例えばAsyncHTTPClient.configure( None, defaults=dict(user_agent="MyUserAgent")) # or with force_instance: client = AsyncHTTPClient(force_instance=True, defaults=dict(user_agent="MyUserAgent"))
バージョン 5.0 で変更:
io_loop引数 (バージョン 4.1 から非推奨) は削除されました。- close() None[source]¶
この HTTP クライアントを破棄し、使用されているファイル記述子を解放します。
AsyncHTTPClientオブジェクトは透過的に再利用されるため、このメソッドは**通常の使用では必要ありません**。close()は、一般的にIOLoopも閉じられる場合、またはAsyncHTTPClientの作成時にforce_instance=True引数が使用された場合にのみ必要です。close()後は、AsyncHTTPClientで他のメソッドを呼び出すことはできません。
- fetch(request: Union[str, HTTPRequest], raise_error: bool = True, **kwargs: Any) Future[HTTPResponse][source]¶
リクエストを実行し、
HTTPResponseを非同期的に返します。リクエストは、文字列 URL または
HTTPRequestオブジェクトのいずれかです。文字列の場合、追加の kwargs を使用してHTTPRequestを構築します:HTTPRequest(request, **kwargs)このメソッドは、結果が
HTTPResponseであるFutureを返します。デフォルトでは、リクエストが 200 以外のレスポンスコードを返した場合、FutureはHTTPErrorを発生させます (サーバーに接続できなかった場合にも、他のエラーが発生する可能性があります)。代わりに、raise_errorが False に設定されている場合、レスポンスコードに関係なく、常にレスポンスが返されます。callbackが指定されている場合、HTTPResponseを使用して呼び出されます。コールバックインターフェースでは、HTTPErrorは自動的に発生しません。代わりに、レスポンスのerror属性を確認するか、rethrowメソッドを呼び出す必要があります。
- classmethod configure(impl: Union[None, str, Type[Configurable]], **kwargs: Any) None[source]¶
使用する
AsyncHTTPClientサブクラスを設定します。AsyncHTTPClient()は、実際にはサブクラスのインスタンスを作成します。このメソッドは、クラスオブジェクトまたはそのようなクラスの完全修飾名(またはデフォルトのSimpleAsyncHTTPClientを使用するにはNone)で呼び出すことができます。追加のキーワード引数が指定された場合、それらは作成された各サブクラスインスタンスのコンストラクターに渡されます。キーワード引数
max_clientsは、各IOLoopで並列に実行できるfetch()操作の最大数を決定します。使用中の実装クラスによっては、追加の引数がサポートされる場合があります。例
AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient")
リクエストオブジェクト¶
- class tornado.httpclient.HTTPRequest(url: str, method: str = 'GET', headers: Optional[Union[Dict[str, str], HTTPHeaders]] = None, body: Optional[Union[bytes, str]] = None, auth_username: Optional[str] = None, auth_password: Optional[str] = None, auth_mode: Optional[str] = None, connect_timeout: Optional[float] = None, request_timeout: Optional[float] = None, if_modified_since: Optional[Union[float, datetime]] = None, follow_redirects: Optional[bool] = None, max_redirects: Optional[int] = None, user_agent: Optional[str] = None, use_gzip: Optional[bool] = None, network_interface: Optional[str] = None, streaming_callback: Optional[Callable[[bytes], None]] = None, header_callback: Optional[Callable[[str], None]] = None, prepare_curl_callback: Optional[Callable[[Any], None]] = None, proxy_host: Optional[str] = None, proxy_port: Optional[int] = None, proxy_username: Optional[str] = None, proxy_password: Optional[str] = None, proxy_auth_mode: Optional[str] = None, allow_nonstandard_methods: Optional[bool] = None, validate_cert: Optional[bool] = None, ca_certs: Optional[str] = None, allow_ipv6: Optional[bool] = None, client_key: Optional[str] = None, client_cert: Optional[str] = None, body_producer: Optional[Callable[[Callable[[bytes], None]], Future[None]]] = None, expect_100_continue: bool = False, decompress_response: Optional[bool] = None, ssl_options: Optional[Union[Dict[str, Any], SSLContext]] = None)[source]¶
HTTPクライアントリクエストオブジェクト。
url以外のパラメータはすべてオプションです。- パラメータ
**url** (str) – フェッチするURL
**method** (str) – HTTPメソッド、例:「GET」または「POST」
**headers** (
HTTPHeadersまたはdict) – リクエストで渡す追加のHTTPヘッダー**body** (
strまたはbytes) – 文字列としてのHTTPリクエスト本文(バイトまたはユニコード; ユニコードの場合、utf-8エンコーディングが使用されます)**body_producer** (collections.abc.Callable) – 遅延/非同期リクエスト本文に使用される呼び出し可能オブジェクト。1つの引数、
write関数で呼び出され、Futureを返す必要があります。新しいデータが利用可能になったら、write 関数を呼び出してデータを渡す必要があります。write 関数は、フロー制御に使用できるFutureを返します。bodyとbody_producerのいずれか一方のみを指定できます。body_producerはcurl_httpclientではサポートされていません。body_producerを使用する場合、チャンクエンコーディングが使用されるため、ヘッダーにContent-Lengthを渡すことをお勧めします。多くのサーバーは、リクエストでチャンクエンコーディングをサポートしていません。Tornado 4.0 での新機能**auth_username** (str) – HTTP認証のユーザー名
**auth_password** (str) – HTTP認証のパスワード
**auth_mode** (str) – 認証モード。デフォルトは「basic」です。許可される値は実装定義です。
curl_httpclientは「basic」と「digest」をサポートします。simple_httpclientは「basic」のみをサポートします。**connect_timeout** (float) – 初期接続のタイムアウト(秒単位)、デフォルトは20秒(0はタイムアウトなし)
request_timeout (float) – リクエスト全体のタイムアウト(秒単位)。デフォルトは20秒(0はタイムアウトなし)
if_modified_since (
datetimeまたはfloat) –If-Modified-Sinceヘッダーのタイムスタンプfollow_redirects (bool) – リダイレクトを自動的に追跡するか、3xxレスポンスを返すか。デフォルトはTrue。
max_redirects (int) –
follow_redirectsの上限。デフォルトは5。user_agent (str) –
User-Agentヘッダーとして送信する文字列decompress_response (bool) – サーバーから圧縮されたレスポンスを要求し、ダウンロード後に解凍する。デフォルトはTrue。Tornado 4.0で追加。
use_gzip (bool) – Tornado 4.0以降、
decompress_responseの非推奨エイリアス。network_interface (str) – リクエストに使用するネットワークインターフェースまたはソースIP。後述の
curl_httpclientの注意事項を参照。streaming_callback (collections.abc.Callable) – 設定されている場合、データの各チャンクが受信されるたびに
streaming_callbackが実行され、最終レスポンスではHTTPResponse.bodyとHTTPResponse.bufferは空になります。header_callback (collections.abc.Callable) – 設定されている場合、各ヘッダー行が受信されるたびに
header_callbackが実行されます(最初の行(例:HTTP/1.0 200 OK\r\n)と、\r\nのみを含む最後の行を含む)。すべての行には、末尾の改行文字が含まれます)。最終レスポンスではHTTPResponse.headersは空になります。これは、リクエストの処理中にヘッダーデータにアクセスする唯一の方法であるため、streaming_callbackと組み合わせて使用するのが最も効果的です。prepare_curl_callback (collections.abc.Callable) – 設定されている場合、アプリケーションが追加の
setopt呼び出しを行えるように、pycurl.Curlオブジェクトを使用して呼び出されます。proxy_host (str) – HTTPプロキシホスト名。プロキシを使用するには、
proxy_hostとproxy_portを設定する必要があります。proxy_username、proxy_pass、proxy_auth_modeはオプションです。プロキシは現在、curl_httpclientでのみサポートされています。proxy_port (int) – HTTPプロキシポート
proxy_username (str) – HTTPプロキシユーザー名
proxy_password (str) – HTTPプロキシパスワード
proxy_auth_mode (str) – HTTPプロキシ認証モード。デフォルトは「basic」。「basic」と「digest」をサポートします。
allow_nonstandard_methods (bool) –
method引数に不明な値を許可するかどうか。デフォルトはFalse。validate_cert (bool) – HTTPSリクエストの場合、サーバーの証明書を検証するかどうか。デフォルトはTrue。
ca_certs (str) – PEM形式のCA証明書のファイル名、またはデフォルトを使用する場合はNone。
curl_httpclientで使用する場合の後述の注意事項を参照。client_key (str) – クライアントSSLキーのファイル名(存在する場合)。
curl_httpclientで使用する場合の後述の注意事項を参照。client_cert (str) – クライアントSSL証明書のファイル名(存在する場合)。
curl_httpclientで使用する場合の後述の注意事項を参照。ssl_options (ssl.SSLContext) –
simple_httpclientで使用するssl.SSLContextオブジェクト(curl_httpclientではサポートされていません)。validate_cert、ca_certs、client_key、およびclient_certをオーバーライドします。allow_ipv6 (bool) – 使用可能な場合はIPv6を使用するかどうか。デフォルトはTrue。
expect_100_continue (bool) – trueの場合、
Expect: 100-continueヘッダーを送信し、リクエスト本文を送信する前に継続レスポンスを待ちます。simple_httpclientでのみサポートされています。
注記
curl_httpclientを使用する場合、pycurlではそれらをクリーンにリセットできないため、特定のオプションが後続のフェッチによって継承される場合があります。これは、ca_certs、client_key、client_cert、およびnetwork_interface引数に適用されます。これらのオプションを使用する場合は、すべてのリクエストでそれらを渡す必要があります(常に同じ値を使用する必要はありませんが、これらのオプションを指定するリクエストとデフォルトを使用するリクエストを混在させることはできません)。バージョン 3.1 で追加:
auth_mode引数。バージョン 4.0 で追加:
body_producerおよびexpect_100_continue引数。バージョン 4.2 で追加:
ssl_options引数。バージョン 4.5 で追加:
proxy_auth_mode引数。
レスポンスオブジェクト¶
- class tornado.httpclient.HTTPResponse(request: HTTPRequest, code: int, headers: Optional[HTTPHeaders] = None(以下略)
HTTP レスポンスオブジェクト。
属性
request: HTTPRequest オブジェクトcode: 数値の HTTP ステータスコード、例: 200 または 404reason: ステータスコードを説明する人間が読める理由句headers:tornado.httputil.HTTPHeadersオブジェクトeffective_url: リダイレクトに従った後のリソースの最終的な場所buffer: レスポンスボディのためのcStringIOオブジェクトbody: バイトとしてのレスポンスボディ (self.bufferからオンデマンドで作成)error: Exception オブジェクト(もしあれば)request_time: リクエスト開始から終了までの秒数。DNS 解決から最後のデータバイトの受信までのすべてのネットワーク操作が含まれます。キューで費やされた時間は含まれません(max_clientsオプションのため)。リダイレクトがフォローされた場合、最後のリクエストのみが含まれます。start_time:time.timeに基づく HTTP 操作の開始時刻(IOLoop.timeが使用するモノトニッククロックではありません)。リクエストがキュー内でタイムアウトした場合、Noneになる可能性があります。time_info: リクエストからの診断タイミング情報の辞書。利用可能なデータは変更される可能性がありますが、現在は http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html から入手可能なタイミングに加えて、AsyncHTTPClientのmax_clients設定でスロットを待つことによって発生する遅延(もしあれば)であるqueueを使用します。
バージョン 5.1 で追加:
start_time属性が追加されました。バージョン 5.1 で変更:
request_time属性には、以前はsimple_httpclientのキューで費やされた時間が含まれていましたが、curl_httpclientでは含まれていませんでした。現在、キューイング時間は両方の実装で除外されています。request_timeは、利用可能な場合はモノトニッククロックを使用するため、curl_httpclientの方が正確になりました。
例外¶
- exception tornado.httpclient.HTTPClientError(code: int, message: Optional[str] = None, response: Optional[HTTPResponse] = None)[source]¶
失敗した HTTP リクエストに対してスローされる例外。
属性
code- HTTP エラー整数エラーコード、例: 404。エラーコード 599 は、タイムアウトなど、HTTP レスポンスが受信されなかった場合に使用されます。response-HTTPResponseオブジェクト(もしあれば)。
もし
follow_redirectsがFalseの場合、リダイレクトはHTTPErrorsとなり、error.response.headers['Location']を見ることでリダイレクト先を確認できます。バージョン 5.1 で変更:
tornado.web.HTTPErrorとの衝突を避けるため、HTTPErrorからHTTPClientErrorに名前変更されました。tornado.httpclient.HTTPErrorという名前はエイリアスとして残ります。
- exception tornado.httpclient.HTTPError¶
HTTPClientErrorのエイリアス。
コマンドラインインターフェース¶
このモジュールは、TornadoのHTTPクライアントを使用してURLを取得するためのシンプルなコマンドラインインターフェースを提供します。 使用例
# Fetch the url and print its body
python -m tornado.httpclient http://www.google.com
# Just print the headers
python -m tornado.httpclient --print_headers --print_body=false http://www.google.com
実装¶
- class tornado.simple_httpclient.SimpleAsyncHTTPClient(force_instance: bool = False, **kwargs: Any)[ソース]¶
外部依存関係のないノンブロッキングHTTPクライアント。
このクラスは、TornadoのIOStreamsの上にHTTP 1.1クライアントを実装します。 curlベースのAsyncHTTPClientにある一部の機能はまだサポートされていません。 特に、プロキシはサポートされておらず、接続は再利用されず、呼び出し元は使用するネットワークインターフェースを選択できません。
この実装は、グローバルシングルトンを制御するために
configure()に渡すか、force_instance=Trueの場合にコンストラクターに渡すことができる、以下の引数をサポートしています。max_clientsは、同時に進行できるリクエストの数です。 この制限に達すると、追加のリクエストはキューに入れられます。 このキューで待機する時間もrequest_timeoutにカウントされることに注意してください。defaultsは、このクライアントに送信されるすべてのHTTPRequestオブジェクトのデフォルトとして使用されるパラメータの辞書です。hostname_mappingは、ホスト名をIPアドレスにマッピングする辞書です。/etc/hostsのようなシステム全体の設定を変更することが不可能または望ましくない場合(例えば、単体テストの場合)に、ローカルDNSの変更を行うために使用できます。resolverも同様ですが、単純なマッピングではなくResolverインターフェースを使用します。max_buffer_size(デフォルトは100MB)は、一度にメモリに読み込むことができるバイト数です。max_body_size(デフォルトはmax_buffer_size) は、クライアントが受け入れる最大のレスポンスボディです。streaming_callbackがない場合、これら2つの制限のうち小さい方が適用されます。streaming_callbackがある場合は、max_body_sizeのみが適用されます。バージョン 4.2 で変更:
max_body_size引数が追加されました。
- class tornado.curl_httpclient.CurlAsyncHTTPClient(max_clients=10, defaults=None)¶
libcurlベースのHTTPクライアント。この実装は、グローバルシングルトンを制御するために
configure()に渡すか、force_instance=Trueの場合にコンストラクターに渡すことができる、以下の引数をサポートしています。max_clientsは、同時に進行できるリクエストの数です。 この制限に達すると、追加のリクエストはキューに入れられます。defaultsは、このクライアントに送信されるすべてのHTTPRequestオブジェクトのデフォルトとして使用されるパラメータの辞書です。
サンプルコード¶
シンプルなウェブスパイダーは、URLを同時に取得する方法を示しています。
ファイルアップローダーのデモは、HTTP POSTまたはHTTP PUTを使用してサーバーにファイルをアップロードします。