Django使用requests库POST传数组仅收到最后一个值的问题
问题根因
数组值仅保留最后一项的问题,由两个操作错误共同导致:
- 错误1:直接对Django的
QueryDict对象执行json.dumps()序列化。QueryDict是Django专为表单格式请求设计的存储结构,不是原生Python字典,直接序列化时不会保留同key对应的多值列表,只会输出每个key的最后一个值,这是数组值丢失的核心原因。 - 错误2:参数key名不匹配。发送端的数组key是带方括号后缀的
word_id[](这是传统表单传数组的命名约定,JSON格式不需要这种写法),但接收端代码尝试获取的key是不带后缀的word_id,即便序列化正常也无法正确取值。
修正方案
调整发送端逻辑,不要直接序列化QueryDict对象,先手动构造符合JSON格式要求的原生Python字典,多值字段通过getlist()方法取全量值,同时统一参数key名:
def wordgrpocc_ajax(request): woccs= [] postVars= request.POST print('postVars= '+str(postVars)) # 构造标准可序列化字典 payload = { "syear": postVars.get("syear", "0"), "eyear": postVars.get("eyear", "0"), # 统一key名为word_id,通过getlist取该key下所有值 "word_id": postVars.getlist("word_id[]", []) } url = skpsettings.API_URL+"word/group/occurrence" headers = {'Content-type': 'application/json'} # 序列化构造好的标准字典即可 bresplist = requests.post(url= url, data=json.dumps(payload), headers=headers) woccs= bresplist.text return HttpResponse(woccs, content_type="application/json")
修正后接收端无需调整,直接通过postVars.get("word_id")就能拿到完整的3个ID组成的列表。
补充说明:传JSON格式参数时,不需要遵循表单传数组的
key[]命名规则,直接给key赋值数组类型即可,多余的方括号后缀反而容易引发key匹配错误。
内容的提问来源于stack exchange,提问作者sariDon
相关产品推荐
相关产品推荐

