httpx 事件掛接

2022-07-26 11:47 更新

HTTPX 允許您向Client注冊“事件鉤子”,每次發(fā)生特定類型的事件時都會調(diào)用這些鉤子。

當前有兩個事件掛接:

  • ?request?- 在請求完全準備就緒后,但在將其發(fā)送到網(wǎng)絡之前調(diào)用。已通過?request?實例。
  • ?response?- 在從網(wǎng)絡獲取響應之后,但在將其返回給調(diào)用方之前調(diào)用。已通過?response?實例。

這允許您安裝客戶端范圍的功能,如日志記錄、監(jiān)視或跟蹤。

def log_request(request):
    print(f"Request event hook: {request.method} {request.url} - Waiting for response")

def log_response(response):
    request = response.request
    print(f"Response event hook: {request.method} {request.url} - Status {response.status_code}")

client = httpx.Client(event_hooks={'request': [log_request], 'response': [log_response]})

您還可以使用這些鉤子來安裝響應處理代碼,例如此示例,該代碼創(chuàng)建一個?httpx.HTTPStatusError?始終在 ?4xx ?和 ?5xx ?響應時引發(fā)的client實例。

def raise_on_4xx_5xx(response):
    response.raise_for_status()

client = httpx.Client(event_hooks={'response': [raise_on_4xx_5xx]})
注意
在確定是否應讀取響應正文之前調(diào)用響應事件掛鉤。
如果需要訪問事件掛接內(nèi)的響應正文,則需要調(diào)用?.response.read() ?,或者AsyncClients的?response.aread()?。

鉤子也允許修改request和response對象。

def add_timestamp(request):
    request.headers['x-request-timestamp'] = datetime.now(tz=datetime.utc).isoformat()

client = httpx.Client(event_hooks={'request': [add_timestamp]})

事件掛接必須始終設置為可調(diào)用列表,并且可以為每種類型的事件注冊多個事件掛接。

除了能夠在實例化?Client?時設置事件鉤子之外,還有一個?.event_hooks?屬性,允許您檢查和修改已安裝的鉤子。

client = httpx.Client()
client.event_hooks['request'] = [log_request]
client.event_hooks['response'] = [log_response, raise_on_4xx_5xx]
注意
如果您使用的是 HTTPX 的異步支持,那么您需要注意,注冊到?httpx.AsyncClient?的掛接必須是異步函數(shù),而不是普通函數(shù)。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號