Django测试传递JSON数据触发ValueError问题求助
Django测试GET请求传JSON报错的解决办法
问题根源
你碰到的ValueError: not enough values to unpack (expected 2, got 1)是因为Django测试客户端的get方法对data参数的处理逻辑:
- 当你传JSON字符串给
data时,客户端会把它当作URL查询参数解析(按&和=拆分键值对),但JSON格式里没有=,解析时拆不出键值对就会报错。 - 直接传字典收空,大概率是视图里用错了参数获取方式(比如用
request.POST或DRF的request.data),GET请求的参数本来就存在于URL查询字符串里,而非请求体。
解决方案
方案1:符合HTTP规范的GET传参(推荐)
GET请求的参数理应放在URL查询字符串中,测试代码直接传字典给data参数,客户端会自动编码成查询字符串:
req_body = {"Value1":"Value1", "Value2":"Value2"} request = self.client.get(self.getSingleData_url, data=req_body)
视图里对应使用request.GET获取参数(DRF视图用request.query_params):
# 普通Django视图 def your_view(request): value1 = request.GET.get("Value1") value2 = request.GET.get("Value2") # 业务逻辑处理... # DRF视图 from rest_framework.views import APIView class YourView(APIView): def get(self, request): value1 = request.query_params.get("Value1") value2 = request.query_params.get("Value2") # 业务逻辑处理...
方案2:硬要给GET请求传JSON请求体(不推荐)
如果业务必须让GET请求从请求体读取JSON(不符合HTTP规范,不建议这么做),别用client.get,改用client.generic手动指定请求体:
import json req_body = {"Value1":"Value1", "Value2":"Value2"} request = self.client.generic( 'GET', self.getSingleData_url, body=json.dumps(req_body), content_type='application/json' )
对应的视图需要手动解析请求体:
import json from django.http import JsonResponse def your_view(request): if request.method == "GET": try: data = json.loads(request.body) except json.JSONDecodeError: return JsonResponse({"error": "无效JSON格式"}, status=400) # 业务逻辑处理... return JsonResponse(data)
内容的提问来源于stack exchange,提问作者Ceemor
相关产品推荐
相关产品推荐

