You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在twisted.web.client中处理403 Forbidden响应体?

如何获取Twisted getPage返回的403错误响应体?

问题描述

我使用Twisted的getPage方法发起请求,代码如下:

client.getPage(url, headers=headers).addCallback(...).addErrback(errorHandler)

对应的错误处理函数为:

def errorHandler(self, error):
    log.critical('Error: ', extra=dict(error=error))

目前仅能得到如下错误信息:

Error: {'error': <twisted.python.failure.Failure twisted.web.error.Error: 403 Forbidden>}

我需要处理该错误响应的响应体(AWS场景),但twisted.web.error.Error没有相关API,且未找到可用示例。通用示例仅包含简单的打印逻辑:

def errorHandler(self, error):
    # release memory and handlers 
    print(error)

请问如何实现获取错误响应体的需求?


解决方法

Twisted的twisted.web.error.Error其实封装了完整的响应对象,你可以通过以下步骤获取响应体:

  1. 从Failure实例中提取Error对象:通过error.value获取twisted.web.error.Error实例。
  2. 访问底层响应对象:Error对象的response属性对应twisted.web.http.Response实例,包含所有响应信息。
  3. 异步读取响应体:调用response.read()方法读取响应体内容,该方法返回Deferred,需通过回调或inlineCallbacks处理结果。

代码示例

回调式实现

def errorHandler(self, error):
    err = error.value
    if isinstance(err, twisted.web.error.Error):
        def process_error_body(body):
            # 处理响应体,比如解析AWS的JSON错误信息
            log.critical('Error response body: ', extra=dict(body=body))
        
        # 异步读取响应体并处理
        err.response.read().addCallback(process_error_body)
    
    log.critical('Error details: ', extra=dict(error=error))

用inlineCallbacks简化异步逻辑

from twisted.internet.defer import inlineCallbacks

@inlineCallbacks
def errorHandler(self, error):
    err = error.value
    if isinstance(err, twisted.web.error.Error):
        # 异步读取响应体
        body = yield err.response.read()
        # 解析AWS错误(通常是JSON格式)
        try:
            import json
            error_data = json.loads(body)
            log.critical('AWS error details: ', extra=dict(data=error_data))
        except json.JSONDecodeError:
            log.critical('Non-JSON error body: ', extra=dict(body=body))
    
    log.critical('Error: ', extra=dict(error=error))

关键说明

  • twisted.web.error.Error的response属性是核心,它保存了完整的HTTP响应对象。
  • response.read()是异步操作,必须通过Deferred的回调链处理,不能直接同步调用获取结果。
  • AWS的4xx/5xx响应体通常为JSON格式,包含具体的错误代码和描述,解析后可以针对性处理。

内容的提问来源于stack exchange,提问作者Leontyev Georgiy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:57:35