Django中request.POST为空,如何正确传递POST请求参数?
解决Django POST请求无法获取JSON参数的问题
问题原因
你用测试客户端发送请求时指定了format='json',这会把数据以JSON格式放在请求体里,但Django的request.POST只能解析application/x-www-form-urlencoded(表单编码)或multipart/form-data类型的请求,JSON数据不会被放到request.POST中,所以你看到的是<QueryDict: {}>。
解决方案
方案1:发送表单编码数据(无需修改后端)
直接去掉format='json'参数,测试客户端默认会发送表单编码的数据,这样request.POST就能正常获取参数:
response = client.post("/foo/bar/api/v1/error/1", {"short_description": "hello", "long_description": "world"})
也可以显式指定内容类型,效果一致:
response = client.post( "/foo/bar/api/v1/error/1", {"short_description": "hello", "long_description": "world"}, content_type='application/x-www-form-urlencoded' )
方案2:后端解析JSON数据(适合需要接收JSON的场景)
如果接口需要支持JSON格式请求,后端要手动解析请求体里的JSON数据:
import json def post(request, *args, **kwargs): # 判断请求是否为JSON类型 if request.content_type == 'application/json': # 解析JSON数据 data = json.loads(request.body) short_description = data.get("short_description", "") long_description = data.get("long_description", "") else: # 兼容表单编码的情况 short_description = request.POST.get("short_description", "") long_description = request.POST.get("long_description", "") # rest of the code goes here
方案3:用Django REST Framework简化处理
如果项目使用了DRF,直接用request.data即可,它会自动处理JSON、表单等多种格式的请求:
from rest_framework.views import APIView class YourErrorView(APIView): def post(self, request, *args, **kwargs): short_description = request.data.get("short_description", "") long_description = request.data.get("long_description", "") # rest of the code goes here
内容的提问来源于stack exchange,提问作者cybertextron
相关产品推荐
相关产品推荐

