httpx 事件挂接

2022-07-26 11:47 更新

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​的挂接必须是异步函数,而不是普通函数。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号