Python POST请求传递CSV转dict数据报too many values to unpack错误
错误含义
你遇到的Error: too many values to unpack (expected 2)错误,是requests库在处理data参数时抛出的:当data参数收到非字符串、非字节类型的可迭代对象时,会默认将其当做表单键值对集合处理,要求每一个迭代元素都是长度为2的(键, 值)结构。你传入的payload是包含多台主机配置的字典列表,每个字典元素拆包时的长度和预期的2不符,因此触发该错误。
代码存在的问题
- 你已经指定了请求头
Content-Type: application/json,但没有将Python原生的列表对象序列化为JSON字符串,直接传入了data参数 - 中间遍历
csv_data的for循环完全冗余,重复赋值后覆盖了之前已经正确序列化的csvJson_data变量,最终payload是未序列化的Python列表 - 需确认目标
add-host接口是否支持批量添加主机:如果接口单次仅允许添加一台主机,直接传入20台主机的列表就算格式正确也会报错
修复方案
情况1:接口支持批量添加主机
直接将payload序列化为JSON字符串后传入data参数,或者直接使用requests内置的json参数(自动完成序列化、自动添加application/json请求头),参考修改后的代码:
import requests, json, csv # 前面登录、发布的代码保持不变 data = open("C:/Users/OdedinaP/Python_Learning/Add-Multi-Host/add_mutli_host.csv") csv_reader = csv.DictReader(data) csv_data = list(csv_reader)[0:20] headers = { 'X-chkp-sid': session_id } url = "https://192.168.15.4/web_api/v1.6.1/add-host" # 直接用json参数传Python对象,requests自动处理序列化 response = requests.request("POST", url, headers=headers, json=csv_data, verify=False) print(response.text)
情况2:接口仅支持单次添加一台主机
遍历每一行CSV数据单独发起请求:
import requests, json, csv # 前面登录、发布的代码保持不变 data = open("C:/Users/OdedinaP/Python_Learning/Add-Multi-Host/add_mutli_host.csv") csv_reader = csv.DictReader(data) csv_data = list(csv_reader)[0:20] headers = { 'X-chkp-sid': session_id } url = "https://192.168.15.4/web_api/v1.6.1/add-host" for row in csv_data: response = requests.request("POST", url, headers=headers, json=row, verify=False) print(response.text)
内容的提问来源于stack exchange,提问作者Peter Odedina
相关产品推荐
相关产品推荐

