You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

aiohttp结合pytest时HTTPNoContent返回文本为空的问题排查

解决aiohttp中HTTPNoContent响应文本为空的问题

你遇到的问题是HTTP 204 NoContent状态码的规范限制导致的:根据HTTP标准,204响应不允许包含任何实体主体(即响应文本),所以aiohttp会自动忽略你传入的text="some test!"参数,最终返回空响应。

原因解析

HTTP 204状态码的定义是“服务器成功处理请求,但无需返回任何内容”,aiohttp框架严格遵循这个规范——当你抛出HTTPNoContent时,无论传入什么text或body参数,都会被框架丢弃,确保响应符合HTTP标准。

解决方案

根据你的需求,有三种处理方式:

  1. 调整状态码保留文本:如果确实需要返回响应文本,改用200 OK状态码:
async def hello(request):
    return web.Response(text="some test!", status=200)

对应的测试用例可以正常断言文本内容。

  1. 用响应头传递信息:如果必须保留204状态码,可把需要传递的信息放在响应头中:
async def hello(request):
    raise HTTPNoContent(headers={"X-Message": "some test!"})

测试时断言响应头:

async def test_hello(aiohttp_client):
    app = web.Application()
    app.router.add_get('/', hello)
    client = await aiohttp_client(app)
    resp = await client.get('/')
    assert resp.status == 204
    assert resp.headers.get("X-Message") == "some test!"
  1. 移除无效断言:如果不需要传递额外信息,直接保留204响应,删除测试中关于文本的断言即可:
async def test_hello(aiohttp_client):
    app = web.Application()
    app.router.add_get('/', hello)
    client = await aiohttp_client(app)
    resp = await client.get('/')
    assert resp.status == 204

内容的提问来源于stack exchange,提问作者Alexey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 23:12:35