测试流式接口时,starlette 客户端不用等应用执行结束才返回。2026 年 10 月 18 日发布的 1.9.0 调整了 testclient 的响应处理,让 client.stream() 在应用结束前交回控制权,要是提前关闭还没读完的响应流,对应应用任务会被取消。这一行为已写入官方版本记录。

来源:Starlette 官方 GitHub
这次改动影响测试客户端和应用执行的时序。针对持续输出内容的端点,测试可先拿到响应,再按流读取;退出未完成的响应流也会触发任务取消。这不是把全量缓存内容换个遍历写法,依赖应用在响应关闭后继续运行的测试会受影响。
该版本还修正了 URL 构建里的路径分隔符处理。生成 request.url 时,路径中的问号、井号、反斜杠及开头双斜杠会做百分号编码,url_path_for 也会处理反斜杠和开头双斜杠。这次修复针对路径数据和 URL 结构的区分,不代表应用可以省略业务参数校验。
响应头部分,类型化或多维 memoryview 的 Content-Length 改按字节长度计算。Host 路由和 TrustedHostMiddleware 以不区分大小写的方式匹配主机名,没有取消允许主机的配置。定义了 GET 的 HTTPEndpoint,在 405 响应的 Allow 头中还会包含 HEAD。
Starlette 1.5.1 是轻量级 Python ASGI 框架与工具集,提供路由、请求响应、中间件、WebSocket 和后台任务等组件,适合构建异步 Web 服务。本下载为官方 PyPI 通用 wheel 包,可使用 pip 安装,并由包管理器处理依赖;运行应用时还需配置 ASGI 服务器。
多个 Vary 头也得到保留。官方说明,MutableHeaders.add_vary_header() 不会再丢失已有的其他 Vary 字段,GZipMiddleware 和 SessionMiddleware 都会调用这个方法。这项改动修正了已有头字段的合并行为,和客户端响应流调整分属不同处理环节。
测试环境仍存在协议边界。现行官方文档显示,测试传输虽能捕获 ASGI 响应尾部字段,但不模拟 HTTP/2 帧,也不模拟请求响应同时流动的完整传输过程。验证这类网络层行为,仍需真实服务器和客户端,不能通过 1.9.0 的响应流支持直接推断。

来源:Starlette 官方文档
1.9.0 发布记录确认了上述改动,测试客户端文档另外说明生命周期处理:仅实例化 TestClient 不会触发 lifespan,需要上下文管理器运行。测试覆盖初始化、流读取和提前关闭,是三个需要分别确认的行为;该版本已有 1.10.0 接续,不能当作当前最新版本。

















