參考資料
tornado.httpclient
-
tornado.httpclient包是Tornado自帶的HTTP客戶端,可以視為CURL或urllib2。 -
tornado.httpclient包包含兩個模塊,一個是同步模塊,一個是異步模塊。
對于應用層的網絡模型是可以分為同步和異步的,同步意味著當前線程是阻塞的,只有當本次請求完成后才能進行下一次的請求。而異步則意味著所有請求均可以同時塞入緩沖區(qū),因此不會阻塞當前的線程。
Tornado的異步包括兩個方面分別為異步服務器和異步客戶端,無論是服務器還是客戶端,具體的異步模型又可以分為回調函數callback和協程coroutine兩種方式。
Tornado客戶端的異步特性主要在于AsyncHTTPClient類的使用,此時的應用場景往往是在Tornado服務內,需要針對另外的IO進行請求和處理。
同步HTTP客戶端
HTTPClient表示同步方式的HTTP客戶端
例如:創(chuàng)建HTTP客戶端并訪問百度首頁
$ vim client.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from tornado.httpclient import HTTPClient, HTTPError
# 創(chuàng)建HTTPClient實例
client = HTTPClient()
try:
# 請求訪問URL獲取HTTP響應HTTPResponse對象
response = client.fetch("http://www.baidu.com")
print(response.body)
except HTTPError as error:
print(error)
# 關閉HTTPClient
client.close()
$ python client.py
HTTPClient實例的fetch方法用于獲取請求所對應的HTTPResponse對象,其原型是
# request可以是一個HTTPRequest對象或一個URL字符串
def fetch(self, requset, **kwargs)
HTTPRequest類和HTTPResponse類定義在httpclient.py文件中
HTTPRequest
HTTPRequest類初始化方法
def __init__(
self,
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
):
HTTPRequest類的初始化方法__init__中的關鍵參數
-
url連接地址 -
method請求方式,默認為GET。 -
headers請求的額外頭,可以是HTTPHeader對象也可以是一個字典dict類型。
HTTPResponse
HTTPResponse類表示HTTP響應,其中定義多個字段,關鍵字段包括:
-
request表示一個HTTPRequest實例 -
code表示HTTP狀態(tài)碼 -
reason表示原因解釋 -
headers表示響應頭,是一個tornado.httputil.HTTPHeaders實例。 -
effective_url表示經過重定向之后的網址 -
body表示字符串的響應體 -
error表示錯誤,出錯則存在Exception異常實例。 -
request_time表示請求整個過程所消耗的時長,單位為秒。
異步HTTP客戶端
Tornado是一個異步的Web框架,這里的異步指的是Tornado服務器與客戶端的網絡交互是異步的,其根本原因是因為Tornado的底層是基于IOLoopIO事件循環(huán)。如果客戶端請求服務器處理的handler中存在阻塞的耗時操作,那么服務器的整體性能就會下降。幸運的是,Tornado提供了一套異步機制,方便實現自己的異步操作。當handler處理需要進行其它的網絡操作時,Tornado專門提供了一個AsyncHTTPClient的異步HTTP客戶端來支持異步操作。
from tornado.httpclient import AsyncHTTPClient
AsyncHTTPClient是tornado.httpclient提供的異步HTTP客戶端,與服務進程一樣,AsyncHTTPClient包含回調callback和攜程yield兩種使用方式,區(qū)別在于回調方式不會返回結果,而協程方式則會返回響應。
例如:創(chuàng)建HTTP異步客戶端訪問百度首頁
$ vim client.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from tornado.httpclient import AsyncHTTPClient
from tornado.ioloop import IOLoop
def handle_request(response):
print(response)
if response.error:
print(response.error)
else:
print(response.body)
client = AsyncHTTPClient()
client.fetch("http://www.baidu.com", handle_request)
IOLoop.instance().start()
同步與異步客戶端的區(qū)別在于,同步方式需要等待完成整個請求,期間CPU是不能做任何事情的。異步方式在發(fā)出請求后將繼續(xù)做其他事情,請求完成后會產生事件來執(zhí)行handle_request函數。handle_request函數也就是回調函數,和CPU的Interrupt中斷機制一樣,能夠提高程序的運行效率。
client = AsyncHTTPClient()
AsyncHTTPClient是一個異步非阻塞的HTTP客戶端,使用AsyncHTTPClient方法需要提供回調函數callback。
client = HTTPClient()
HTTPClient是同步阻塞的HTTP客戶端,它是完全同步的,也就是說當HTTPClient發(fā)生阻塞時,其他人是無法訪問的。