前端发JSON格式POST请求,Django中request.POST参数为空如何解决?
问题原因及解决方案
你遇到的问题是因为前端发送的是JSON格式的请求体,而Django的request.POST仅用于解析application/x-www-form-urlencoded或multipart/form-data类型的表单数据,不会自动解析JSON格式的请求内容。
解决方法有两种:
方法1:使用Django REST Framework的request.data(推荐)
因为你已经用了DRF的@api_view装饰器,DRF会自动解析JSON、表单等多种格式的请求体,直接通过request.data获取数据即可:
from rest_framework.decorators import api_view @api_view(['POST']) def run_ngen(request): # DRF自动解析JSON请求体,直接从request.data取数据 cmd = request.data.get('cmd') print("cmd参数:", cmd) # 也可以打印所有参数 print("所有参数:", request.data)
方法2:手动解析request.body
如果不想依赖DRF的自动解析,也可以手动读取并解析请求体的JSON内容:
from rest_framework.decorators import api_view import json from django.http import JsonResponse @api_view(['POST']) def run_ngen(request): try: # 读取request.body并解析为JSON对象 payload = json.loads(request.body) print("params", payload.keys()) print("cmd参数:", payload.get('cmd')) except json.JSONDecodeError: # 处理JSON解析失败的异常 return JsonResponse({"error": "无效的JSON格式"}, status=400)
额外注意事项
如果是同域请求,要确保前端正确携带Django的CSRF Token,否则可能触发403权限错误。可以在前端请求中添加CSRF头:
// 获取页面中的CSRF Token const csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value; fetch('/runNgen/', { method: "POST", body: JSON.stringify(payload), headers: { "Content-Type": "application/json", "X-CSRFToken": csrftoken } })
内容的提问来源于stack exchange,提问作者Peter Kronenberg
相关产品推荐
相关产品推荐

