tornado.httpclient — 异步 HTTP 客户端¶
阻塞和非阻塞的 HTTP 客户端接口.
这个模块定义了一个被两种实现方式 simple_httpclient 和
curl_httpclient 共享的通用接口 . 应用程序可以选择直接实例化相对应的实现类,
或使用本模块提供的 AsyncHTTPClient 类, 通过复写
AsyncHTTPClient.configure 方法来选择一种实现 .
默认的实现是 simple_httpclient, 这可以能满足大多数用户的需要 . 然而, 一
些应用程序可能会因为以下原因想切换到 curl_httpclient :
curl_httpclient有一些simple_httpclient不具有的功能特性, 包括对 HTTP 代理和使用指定网络接口能力的支持.curl_httpclient更有可能与不完全符合 HTTP 规范的网站兼容, 或者与 使用很少使用 HTTP 特性的网站兼容.curl_httpclient更快.curl_httpclient是 Tornado 2.0 之前的默认值.
注意, 如果你正在使用 curl_httpclient, 强力建议你使用最新版本的
libcurl 和 pycurl. 当前 libcurl 能被支持的最小版本是
7.21.1, pycurl 能被支持的最小版本是 7.18.2. 强烈建议你所安装的 libcurl
是和异步 DNS 解析器 (threaded 或 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=None, **kwargs)[源代码]¶ 一个阻塞的 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()
-
fetch(request, **kwargs)[源代码]¶ 执行一个请求, 返回一个
HTTPResponse对象.该请求可以是一个 URL 字符串或是一个
HTTPRequest对象. 如果它是一个字符串, 我们会使用任意关键字参数构造一个HTTPRequest:HTTPRequest(request, **kwargs)如果在 fetch 过程中发生错误, 我们将抛出一个
HTTPError除非raise_error关键字参数被设置为 False.
-
-
class
tornado.httpclient.AsyncHTTPClient[源代码]¶ 一个非阻塞 HTTP 客户端.
使用示例:
def handle_request(response): if response.error: print "Error:", response.error else: print response.body http_client = AsyncHTTPClient() http_client.fetch("http://www.google.com/", handle_request)
这个类的构造器有几个比较神奇的考虑: 它实际创建了一个基于特定实现的子 类的实例, 并且该实例被作为一种伪单例重用 (每一个
IOLoop). 使用关键字参数force_instance=True可以用来限制这种单例行为. 只有使用了force_instance=True时候, 才可以传递io_loop以外其他 的参数给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"))
在 4.1 版更改:
io_loop参数被废弃.-
close()[源代码]¶ 销毁该 HTTP 客户端, 释放所有被使用的文件描述符.
因为
AsyncHTTPClient对象透明重用的方式, 该方法 在正常使用时并不需要 .close()一般只有在IOLoop也被关闭, 或在创建AsyncHTTPClient的时候使用了force_instance=True参数才需要.在
AsyncHTTPClient调用close()方法后, 其他方法就不能被调用 了.
-
fetch(request, callback=None, raise_error=True, **kwargs)[源代码]¶ 执行一个请求, 并且异步的返回
HTTPResponse.request 参数可以是一个 URL 字符串也可以是一个
HTTPRequest对象. 如果是一个字符串, 我们将使用全部的关键字参数一起构造一个HTTPRequest对象:HTTPRequest(request, **kwargs)这个方法返回一个结果为
HTTPResponse的Future对象. 默认情况下, 如果该请求返回一个非 200 的响应码, 这个Future将会抛出一个HTTPError错误. 相反, 如果raise_error设置为 False, 则无论响应码如何, 都将返回该 response (响应).如果给定了
callback, 它将被HTTPResponse调用. 在回调接口中,HTTPError不会自动抛出. 相反你必须检查该响应的error属性或者调用它的rethrow方法.
-
classmethod
configure(impl, **kwargs)[源代码]¶ 配置要使用的
AsyncHTTPClient子类.AsyncHTTPClient()实际上是创建一个子类的实例. 此方法可以使用一个类对象或此类的完全限定名称(或为None则使用默认的,SimpleAsyncHTTPClient) 调用.如果给定了额外的关键字参数, 它们将会被传递给创建的每个子类实例的 构造函数. 关键字参数
max_clients确定了可以在每个IOLoop上 并行执行的fetch()操作的最大数量. 根据使用的 实现类不同, 可能支持其他参数.例如:
AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient")
-
Request 对象¶
-
class
tornado.httpclient.HTTPRequest(url, method='GET', headers=None, body=None, auth_username=None, auth_password=None, auth_mode=None, connect_timeout=None, request_timeout=None, if_modified_since=None, follow_redirects=None, max_redirects=None, user_agent=None, use_gzip=None, network_interface=None, streaming_callback=None, header_callback=None, prepare_curl_callback=None, proxy_host=None, proxy_port=None, proxy_username=None, proxy_password=None, allow_nonstandard_methods=None, validate_cert=None, ca_certs=None, allow_ipv6=None, client_key=None, client_cert=None, body_producer=None, expect_100_continue=False, decompress_response=None, ssl_options=None)[源代码]¶ HTTP 客户端请求对象.
除了
url以外所有参数都是可选的.参数: - url (string) – fetch 的 URL
- method (string) – HTTP 方法, e.g. “GET” or “POST”
- headers (
HTTPHeaders或dict) – 额外的 HTTP 请求头 - body – HTTP 请求体字符串 (byte 或 unicode; 如果是 unicode 则使用 utf-8 编码)
- body_producer – 可以被用于延迟/异步请求体调用.
它可以被调用, 带有一个参数, 一个
write函数, 并应该 返回一个Future对象. 它应该在新的数据可用时调用 write 函数. write 函数返回一个可用于流程控制的Future对象. 只能指定body和body_producer其中之一.body_producer不被curl_httpclient支持. 当使用body_producer时, 建议传递一个Content-Length头, 否则将使用其他的分块编码, 并且很多服务断不支持请求的分块编码. Tornado 4.0 新增 - auth_username (string) – HTTP 认证的用户名
- auth_password (string) – HTTP 认证的密码
- auth_mode (string) – 认证模式; 默认是 “basic”.
所允许的值是根据实现方式定义的;
curl_httpclient支持 “basic” 和 “digest”;simple_httpclient只支持 “basic” - connect_timeout (float) – 初始化连接的超时时间
- request_timeout (float) – 整个请求的超时时间
- if_modified_since (
datetime或float) –If-Modified-Since头的时间戳 - follow_redirects (bool) – 是否应该自动跟随重定向还是返回 3xx 响应?
- max_redirects (int) –
follow_redirects的最大次数限制 - user_agent (string) –
User-Agent头 - decompress_response (bool) – 从服务器请求一个压缩过的响应, 在下载 后对其解压缩. 默认是 True. Tornado 4.0 新增.
- use_gzip (bool) –
decompress_response的别名从 Tornado 4.0 已弃用. - network_interface (string) – 请求所使用的网络接口.
只有
curl_httpclient; 请看下面的备注. - streaming_callback (callable) – 如果设置了,
streaming_callback将 用它接收到的数据块执行, 并且HTTPResponse.body和HTTPResponse.buffer在最后的响应中将为空. - header_callback (callable) – 如果设置了,
header_callback将 在接收到每行头信息时运行(包括第一行, e.g.HTTP/1.0 200 OK\r\n, 最后一行只包含\r\n. 所有行都包含结尾的换行符).HTTPResponse.headers在最终响应中将为空. 这与streaming_callback结合是最有用的, 因为它是在请求正在进行时 访问头信息唯一的方法. - prepare_curl_callback (callable) – 如果设置, 将使用
pycurl.Curl对象调用, 以允许应用程序进行额外的setopt调用. - proxy_host (string) – HTTP 代理主机名. 如果想要使用代理,
proxy_host和proxy_port必须设置;proxy_username和proxy_pass是可选项. 目前只有curl_httpclient支持代理. - proxy_port (int) – HTTP 代理端口
- proxy_username (string) – HTTP 代理用户名
- proxy_password (string) – HTTP 代理密码
- allow_nonstandard_methods (bool) – 允许
method参数使用未知值? - validate_cert (bool) – 对于 HTTPS 请求, 是否验证服务器的证书?
- ca_certs (string) – PEM 格式的 CA 证书的文件名, 或者默认为 None.
当与
curl_httpclient一起使用时参阅下面的注释. - client_key (string) – 客户端 SSL key 文件名(如果有).
当与
curl_httpclient一起使用时参阅下面的注释. - client_cert (string) – 客户端 SSL 证书的文件名(如果有).
当与
curl_httpclient一起使用时参阅下面的注释. - ssl_options (ssl.SSLContext) – 用在
simple_httpclient(curl_httpclient不支持) 的ssl.SSLContext对象. 覆写validate_cert,ca_certs,client_key, 和client_cert. - allow_ipv6 (bool) – 当 IPv6 可用时是否使用? 默认是 true.
- expect_100_continue (bool) – 如果为 true, 发送
Expect: 100-continue头并在发送请求体前等待继续响应. 只被 simple_httpclient 支持.
3.1 新版功能:
auth_mode参数.4.0 新版功能:
body_producer和expect_100_continue参数.4.2 新版功能:
ssl_options参数.
Response 对象¶
-
class
tornado.httpclient.HTTPResponse(request, code, headers=None, buffer=None, effective_url=None, error=None, request_time=None, time_info=None, reason=None)[源代码]¶ HTTP 响应对象.
属性:
- request: HTTPRequest 对象
- code: HTTP 状态码数值, e.g. 200 或 404
- reason: 人类可读的, 对状态码原因的简短描述
- headers:
tornado.httputil.HTTPHeaders对象 - effective_url: 跟随重定向后资源的最后位置
- buffer: 响应体的
cStringIO对象 - body: string 化的响应体 (从
self.buffer的需求创建) - error: 任何异常对象
- request_time: 请求开始到结束的时间(秒)
- time_info: 来自请求的诊断时间信息的字典.
可用数据可能会更改, 不过当前在用的时间信息是
http://curl.haxx.se/libcurl/c/curl_easy_getinfo.html,
加上
queue, 这是通过等待在AsyncHTTPClient的max_clients设置下的插槽引入的延迟(如果有的话).
异常¶
-
exception
tornado.httpclient.HTTPError(code, message=None, response=None)[源代码]¶ 一个 HTTP 请求失败后抛出的异常.
属性:
code- 整数的 HTTP 错误码, e.g. 404. 当没有接收到 HTTP 响应时 将会使用 599 错误码, e.g. 超时.response- 全部的HTTPResponse对象.
注意如果
follow_redirects为 False, 重定向将导致 HTTPErrors, 并且你可以通过error.response.headers['Location']查看重定向的 描述.
Command-line 接口¶
This module provides a simple command-line interface to fetch a url using Tornado’s HTTP client. Example usage:
# 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