如何使用Python + aiohttp获取HTTP 403响应的主体?

时间:2019-03-13 13:17:44

标签: python python-3.x rest http-status-code-403 aiohttp

我正在使用Python 3.6和aiohttp库向服务器发出API Post请求。如果在发出请求时使用错误的用户名,则会收到HTTP 403错误,正如我所期望的那样。当我在邮递员中发出此请求时,响应的主体显示为:

{"error_message": "No entitlements for User123"}

但是,当我使用aiohttp发出请求时,在任何地方都看不到此响应正文。该消息只是说“禁止”。如何在我的Python代码中获取上面的错误消息?

编辑:这是我的aiohttp代码,尽管非常简单:

try:
    async with self.client_session.post(url, json=my_data, headers=my_headers) as response:
        return await response.json()
except ClientResponseError as e:
    print(e.message)  # I want to access the response body here
    raise e

编辑2:我找到了解决方法。创建client_session时,我将raise_for_status值设置为False。然后,当我从API调用获得响应时,我检查状态是否为> =400。如果是,则我自己处理错误,其中包括响应的正文。

编辑3:这是我的解决方法的代码:

self.client_session = ClientSession(loop=asyncio.get_event_loop(), raise_for_status=False)
####################### turn off the default exception handling ---^

try:
    async with self.client_session.post(url, json=my_data, headers=my_headers) as response:
    body = await response.text()

    # handle the error myself so that I have access to the response text
    if response.status >= 400:
        print('Error is %s' % body)
        self.handle_error(response)

1 个答案:

答案 0 :(得分:1)

是的,如果您来自requests软件包,而该软件包的异常对象具有.request.response(或者相反)属性,则可能确实令人困惑。

您已经很清楚地发现了这一点,但这是一个正确的答案:

async with session.post(...) as response:
    try:
        response.raise_for_status()
    except ClientResponseError as err:
        logger.error("Error: %s, Error body: %s", err, (await response.text()))

    return await response.json()