Aiohttp 会话超时不会取消请求

问题描述 投票:0回答:1

我有这段代码,我发送一个

POST
请求并使用
aiohttp
包设置最大超时:

from aiohttp import ClientTimeout, ClientSession

response_code = None
timeout = ClientTimeout(total=2)

async with ClientSession(timeout=timeout) as session:
    try:
        async with session.post(
            url="some url", json=post_payload, headers=headers,
        ) as response:
            response_code = response.status
    except Exception as err:
        logger.error(err)

该部分有效,但是每当超时和分别达到

except
子句时,请求似乎都不会被取消 - 即使已引发异常,我仍然在另一端收到它。我希望只要达到超时时间,请求就会自动取消。预先感谢。

python post timeout aiohttp
1个回答
0
投票

如果没有服务器代码,很难说服务器端出了什么问题。

对于当前版本的

aiohttp
,您需要显式启用它

解决方案基于启动服务器的方式:

  1. 如果您使用
    web.AppRunner
    那么您必须将
    handler_cancellation=True
    传递给其构造函数
app = web.Application()
app.add_routes(routes)
runner = web.AppRunner(
    app,
    handler_cancellation=True,
)
await runner.setup()
site = web.TCPSite(runner, port=port)
await site.start()
  1. 如果您“显式”运行服务器(我不确定术语),那么您必须将
    handler_cancellation=True
    直接传递到
    run_app
    方法中:
from aiohttp import web

async def handle(request):
    return web.Response(text="Hello, world")

app = web.Application()
app.router.add_get('/', handle)
web.run_app(app, handler_cancellation=True)
© www.soinside.com 2019 - 2024. All rights reserved.