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

Flask图片上传预测接口单元测试TypeError报错求助

问题分析与解决方案

核心问题点

  1. 请求参数不匹配:接口通过request.files.getlist("images")获取批量文件,但测试代码里用的参数键是image,导致接口判定"images" not in request.files,返回index.html,后续测试断言逻辑完全偏离预期。
  2. 响应类型错误:接口返回的是渲染后的HTML模板(render_template),而非JSON数据,但测试代码尝试通过rv.json["filename"]解析JSON,导致rv.json为None,触发TypeError: 'NoneType' object is not subscriptable。
  3. 断言逻辑错误:原测试断言的rv.json["filename"]完全不符合接口的返回结构,接口返回的是包含预测结果字典的HTML页面,而非单独的filename字段。

修复后的单元测试代码

def test_upload_1files(test_client):
    # 确保测试文件存在,或用临时文件模拟真实图片
    with open("fakeimage1.png", "rb") as img_file:
        data = {
            # 键名改为接口要求的"images",用列表格式适配getlist逻辑
            'images': [(img_file, "fakeimage1.png")]
        }
        rv = test_client.post('/', data=data, content_type='multipart/form-data')
    
    # 断言状态码符合预期
    assert rv.status_code == 201
    # 断言响应内容包含上传的文件名(接口返回的results.html会渲染文件名)
    assert b"fakeimage1.png" in rv.data
    # 若需验证预测结果,可根据RCLASSES的预期值补充断言
    # assert b"[你的预期分类结果]" in rv.data

额外优化建议

  • 模型加载优化:当前接口每次POST请求都重新加载模型(rmodel = tf.keras.models.load_model(MODEL)),建议把模型加载代码移到路由外部,避免重复加载浪费资源。
  • 文件校验增强:对上传文件的格式、有效性(如非图片文件)增加校验,防止Image.open(file)抛出异常导致接口崩溃。
  • 测试文件模拟:使用tempfile模块创建临时测试图片,避免依赖本地真实文件,提升测试的独立性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:48:46