Django项目中QueryDict返回异常值的技术咨询
jsonobj值不符合预期的问题 嘿,看你遇到的这个问题,我之前调试Django API的时候也踩过类似的坑!你看到的jsonobj变成字段名列表的情况,本质是请求的数据格式和视图的解析方式不匹配导致的。下面给你一步步拆解解决方法:
1. 先检查你的requests请求怎么发的
如果你用requests库发POST请求时,把要传的JSON对象直接丢进data参数里,那requests会自动把它编码成application/x-www-form-urlencoded格式——这就会让Django把JSON里的每个键都当成独立的表单字段,最后jsonobj就变成了这些键的列表,完全不是你要的JSON对象。
正确的做法是用json参数来传数据,requests会自动设置Content-Type: application/json,还会帮你序列化JSON:
import requests # 示例:正确发送JSON数据的方式 payload = { "jsonobj": { "register_id": "你的值", "meter_id": "你的值", "reading_date": "你的值", # 其他字段... } } response = requests.post("你的API地址", json=payload)
2. 调整Django视图的解析逻辑
Django的request.POST只处理表单格式的数据(form-data或x-www-form-urlencoded),如果是JSON格式的请求,数据其实在request.body里。你可以直接解析这个原始数据:
from django.http import JsonResponse import json from rest_framework.decorators import api_view @api_view(['GET', 'POST']) def s0003_view(request): if request.method == 'POST': try: # 解析JSON请求体 request_data = json.loads(request.body) obj = request_data.get('jsonobj') print(obj) # 现在应该是你预期的完整JSON对象了 return JsonResponse({"status": "success"}) except json.JSONDecodeError: return JsonResponse({"status": "error", "msg": "JSON格式错误"}, status=400)
如果你用了Django REST Framework,更简单——直接用request.data,它会自动识别请求格式并解析:
@api_view(['GET', 'POST']) def s0003_view(request): if request.method == 'POST': obj = request.data.get('jsonobj') print(obj) # 后续业务逻辑...
3. 确认请求的Content-Type
你可以在视图里加一行打印,确认请求头是否正确:
print(request.content_type)
如果输出是application/json,那说明请求格式没问题;如果是application/x-www-form-urlencoded或multipart/form-data,那肯定是requests调用的时候没用到json参数,得改。
4. 特殊情况:必须用form-data传JSON?
如果因为某些限制,你必须用表单格式传JSON,那得先把jsonobj序列化成字符串再传:
import requests import json payload = { "jsonobj": json.dumps({ "register_id": "你的值", # 其他字段... }) } response = requests.post("你的API地址", data=payload)
然后在视图里把字符串反序列化成JSON对象:
obj_str = request.POST.get('jsonobj') obj = json.loads(obj_str)
基本上按照这几步来,就能解决你看到的奇怪QueryDict问题了。核心就是确保请求发送的格式和视图解析的方式对应上,别让两边“鸡同鸭讲”~
内容的提问来源于stack exchange,提问作者DariusFontaine

