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

调用Clarifai食品检测模型触发ValueError错误的解决求助

解决Clarifai gRPC调用时的ValueError: too many values to unpack (expected 2)

问题描述

我正在开发食品图片识别功能:上传图片后用Clarifai食品检测模型识别,将结果展示在HTML页面,代码如下:

from flask import Flask,render_template,request,redirect,url_for ,session
from PIL import Image
import pandas as pandas
from werkzeug.utils import secure_filename
from clarifai_grpc.grpc import api
from clarifai_grpc.grpc.api import service_pb2, resources_pb2
from clarifai_grpc.grpc.api.status import status_code_pb2
from clarifai_grpc.channel.clarifai_channel import ClarifaiChannel
from clarifai_grpc.grpc.api import service_pb2_grpc
stub = service_pb2_grpc.V2Stub(ClarifaiChannel.get_grpc_channel())

app=Flask(__name__,template_folder='templates',static_folder='static')
app.secret_key='a'


@app.route('/',methods=['POST','GET'])
def food():
    metadata = (('authorization', 'Key {XXXXXXX}'))
    if request.method =='POST' :
        file = request.files['Image']
        image = Image.open(file)
        my_request =service_pb2.PostModelOutputsRequest(model_id='9504135848be0dd2c39bdab0002f78e9',inputs=[resources_pb2.Input(data=resources_pb2.Data(image=resources_pb2.Image(base64=file.getvalue())))])
        response = stub.PostModelOutputs(my_request,metadata=metadata)
        print(response)
        if response.status.code != status_code_pb2.SUCCESS: 
            raise Exception("Request failed, status code: " + str(response.status.code))
      
        names = []
        confidences = []
        for concept in response.outputs[0].data.concepts:
            names.append(concept.name)
            confidences.append(concept.value)

        return render_template('button.html',img=image,searchResults=names)
    return render_template('button.html')


if __name__=="__main__":
    app.run(debug=True ,host='0.0.0.0')

运行时执行response = stub.PostModelOutputs(my_request,metadata=metadata)一行出现错误:

ValueError: too many values to unpack (expected 2)

解决方案

核心问题:metadata格式错误

gRPC的metadata参数要求传入一个由(key, value)二元组组成的可迭代对象(列表或元组),你当前的写法metadata = (('authorization', 'Key {XXXXXXX}'))在Python中等价于('authorization', 'Key {XXXXXXX}')——这是一个二元组,而非包含二元组的可迭代对象。gRPC会尝试迭代这个二元组的每个元素(即字符串),将每个字符串拆分为key-value对,从而触发“too many values to unpack”错误。

修正方法二选一:

# 方式1:使用列表(推荐)
metadata = [('authorization', 'Key {XXXXXXX}')]
# 方式2:使用带逗号的元组(确保是包含单个二元组的元组)
metadata = (('authorization', 'Key {XXXXXXX}'),)

额外潜在问题修正

  1. 你导入了pandas但未使用,可以删除该行代码以优化项目结构。
  2. 直接将PIL Image对象img=image传给模板无法在HTML中渲染,需要将图片转换为base64字符串或保存到静态目录后传递路径。例如转换为base64的代码:
    import base64
    from io import BytesIO
    
    # 在获取file并打开图片后添加
    img_buffer = BytesIO()
    image.save(img_buffer, format='JPEG')
    img_base64 = base64.b64encode(img_buffer.getvalue()).decode('utf-8')
    # 模板中使用:<img src="data:image/jpeg;base64,{{ img_base64 }}">
    return render_template('button.html', img_base64=img_base64, searchResults=names)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:01:42