You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 23:52:29