httpx 事件挂接
HTTPX 允许您向Client注册“事件钩子”,每次发生特定类型的事件时都会调用这些钩子。
当前有两个事件挂接:
-
request
- 在请求完全准备就绪后,但在将其发送到网络之前调用。已通过request
实例。 -
response
- 在从网络获取响应之后,但在将其返回给调用方之前调用。已通过response
实例。
这允许您安装客户端范围的功能,如日志记录、监视或跟踪。
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]})
您还可以使用这些钩子来安装响应处理代码,例如此示例,该代码创建一个httpx.HTTPStatusError
始终在 4xx
和 5xx
响应时引发的client实例。
def raise_on_4xx_5xx(response):
response.raise_for_status()
client = httpx.Client(event_hooks={'response': [raise_on_4xx_5xx]})
注意
在确定是否应读取响应正文之前调用响应事件挂钩。
如果需要访问事件挂接内的响应正文,则需要调用.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]})
事件挂接必须始终设置为可调用列表,并且可以为每种类型的事件注册多个事件挂接。
除了能够在实例化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
的挂接必须是异步函数,而不是普通函数。