gpt4 book ai didi

python - 调用 raise_for_status 时具有请求正文/内容/文本的 AIOHTTP

转载 作者:行者123 更新时间:2023-12-05 03:45:12 24 4
gpt4 key购买 nike

我将 FastAPIaiohttp 一起使用,我为持久 session 构建了一个单例,我用它在启动时打开 session 并在关闭时关闭它.

需求:response 正文在失败的情况下很重要,我必须将其与其他详细信息一起记录下来。

因为 raise_for_status 的行为方式,我不得不编写那些处理每个 HTTP 方法的丑陋函数,这是其中之一:

async def post(self, url: str, json: dict, headers: dict) -> ClientResponse:
response = await self.session.post(url=url, json=json, headers=headers)
response_body = await response.text()

try:
response.raise_for_status()
except Exception:
logger.exception('Request failed',
extra={'url': url, 'json': json, 'headers': headers, 'body': response_body})
raise

return response

如果我可以指望 raise_for_status 也返回正文 (response.text()),我可以启动 session ClientSession(raise_for_status=True) 并编写干净的代码:

response = await self.session.post(url=url, json=json, headers=headers)

有没有办法以某种方式强制 raise_for_status 也返回负载/主体,也许在 ClientSession 的初始化中?

感谢您的帮助。

最佳答案

aiohttpraise_for_status 是不可能的。正如@Andrew Svetlov 回答的那样 here :

Consider response as closed after raising an exception.Technically it can contain a partial body but there is no any guarantee.There is no reason to read it, the body could be very huge, 1GiB is not a limit.If you need a response content for non-200 -- read it explicitly.

或者,考虑使用 httpx图书馆以这种方式。 (广泛与FastAPI结合使用):

def raise_on_4xx_5xx(response):
response.raise_for_status()

async with httpx.AsyncClient(event_hooks={'response': [raise_on_4xx_5xx]}) as client:
try:
r = await client.get('http://httpbin.org/status/418')
except httpx.HTTPStatusError as e:
print(e.response.text)

关于python - 调用 raise_for_status 时具有请求正文/内容/文本的 AIOHTTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65983012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com