JS通过Fetch发送POST请求至Django后无法获取参数的问题排查
问题分析与解决办法
你遇到的问题核心在于请求体的格式处理错误,以及Django对JSON类型请求的解析逻辑和表单请求不同,下面一步步给你拆解修复方案:
1. 前端JS代码的关键错误
你的fetch请求直接把JS对象传给了body参数,但浏览器不会自动将对象序列化为JSON字符串——必须手动调用JSON.stringify()完成转换,否则浏览器会把对象转成[object Object]这种无效字符串,后端自然解析不到数据。
修正后的JS代码:
function sendStatistic(csrftoken, song_id, answer) { fetch('request/', { method: 'POST', headers: { 'X-CSRFToken': csrftoken, 'Accept': 'application/json', 'Content-Type': 'application/json', }, // 必须用JSON.stringify把对象转成JSON字符串 body: JSON.stringify({ 'Song-Id': song_id, 'Answer': answer , }), }); }
2. Django后端的正确解析方式
当请求的Content-Type为application/json时,Django的request.POST是空的——因为request.POST只负责解析application/x-www-form-urlencoded(表单默认编码)或multipart/form-data格式的请求体。
要获取JSON格式的请求数据,你需要从request.body中读取并解析:
import json from django.http import JsonResponse def your_statistic_view(request): if request.method == 'POST': # 解析JSON请求体 data = json.loads(request.body) song_id = data.get('Song-Id') answer = data.get('Answer') # 这里写你的业务逻辑 return JsonResponse({'status': 'success'})
如果你的Django版本是3.1及以上,还可以直接用request.json属性(它会自动帮你完成request.body的解析):
from django.http import JsonResponse def your_statistic_view(request): if request.method == 'POST': song_id = request.json.get('Song-Id') answer = request.json.get('Answer') # 业务逻辑处理 return JsonResponse({'status': 'success'})
额外可选方案:改用表单格式请求
如果你想继续用request.POST.get()来获取参数,可以把前端请求改成表单格式,不需要JSON:
function sendStatistic(csrftoken, song_id, answer) { const formData = new FormData(); formData.append('Song-Id', song_id); formData.append('Answer', answer); fetch('request/', { method: 'POST', headers: { 'X-CSRFToken': csrftoken, }, body: formData, }); }
这种情况下,后端用request.POST.get('Song-Id')和request.POST.get('Answer')就能正常拿到值了。
内容的提问来源于stack exchange,提问作者Seliverstov
相关产品推荐
相关产品推荐

