codecamp

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


httpx 请求实例
httpx 监视下载进度
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }