使用TestClient测试FastAPI+asyncpg应用二次请求报错排查
问题原因解析
核心根源:事件循环的生命周期管理问题
你遇到的问题本质是TestClient非上下文模式下未正确维护异步事件循环的生命周期,结合asyncpg对事件循环的强依赖导致:
非上下文管理器模式的缺陷:
直接初始化TestClient(不用with语句)时,第一次请求会创建并绑定一个异步事件循环,但请求结束后,TestClient不会自动执行清理逻辑——包括关闭事件循环、销毁asyncpg连接池等资源。第二次请求时,TestClient尝试复用已关闭的事件循环,而asyncpg的连接池是绑定到原事件循环的,此时连接池已不可用,底层抛出Event loop is closed异常,上层被包装为cannot perform operation: another operation is in progress错误。上下文管理器模式的修复逻辑:
使用with TestClient(app) as client时,with语句会自动触发TestClient的__enter__和__exit__方法:__enter__:确保创建/获取活跃的异步事件循环,初始化asyncpg连接池;__exit__:请求结束后,主动关闭asyncpg连接池、终止事件循环并清理所有关联资源。
每次进入上下文都会有全新的活跃事件循环环境,第二次请求自然能正常执行。
curl测试正常的原因
curl作为外部HTTP客户端,每次请求都是独立的HTTP调用——你的FastAPI应用运行在服务器(如uvicorn)时,服务器会持续维护一个活跃的异步事件循环,所有请求都在这个循环中处理,不存在循环被关闭的情况,因此多次请求都能正常工作。
内容的提问来源于stack exchange,提问作者persson
相关产品推荐
相关产品推荐

