Django视图处理axios多参数POST请求获取参数为None如何解决?
问题根因
你通过axios发送的是application/json格式的POST请求,Django的request.POST对象仅支持解析表单格式(application/x-www-form-urlencoded/multipart/form-data)的请求数据,不会自动解析JSON payload,因此直接取值返回None。
解决方案
提供两种适配方案,可根据场景选择:
方案1:后端适配JSON请求(前后端分离场景推荐)
修改views.py逻辑,手动解析请求体中的JSON数据:
import json from django.http import JsonResponse def render_data(request): if request.method == 'POST' and request.content_type == 'application/json': # 解析JSON格式请求体 req_data = json.loads(request.body) reddit_url = req_data.get('reddit_url') sort = req_data.get('sort') else: # 可保留原逻辑兼容表单格式请求 reddit_url = request.POST.get('reddit_url') sort = request.POST.get('sort') print(reddit_url, sort) users_data, count = run_data(reddit_url, sort) data = { 'users_data': users_data, 'count': count, } return JsonResponse(data)
如果后续接口数量较多,可引入Django REST Framework,直接使用request.data即可自动适配多种请求格式,无需手动解析。
方案2:前端改为发送表单格式请求
无需修改后端现有逻辑,调整前端axios请求参数格式即可:
方式A:使用FormData构造参数
const APIcall = () => { // 构造表单数据对象 const formData = new FormData(); formData.append('reddit_url', location.state.link); formData.append('sort', location.state.sort); axios .post( `http://127.0.0.1:8000/reddit_data/`, formData, { headers: { "X-CSRFToken": location.state.token, }, withCredentials: true, } ) .then((res) => { console.log("YESSIR"); setLoading(false); }); };
方式B:使用qs库序列化参数
首先安装依赖:npm install qs
import qs from 'qs'; const APIcall = () => { axios .post( `http://127.0.0.1:8000/reddit_data/`, qs.stringify({ reddit_url: location.state.link, sort: location.state.sort, }), { headers: { "Content-Type": "application/x-www-form-urlencoded", "X-CSRFToken": location.state.token, }, withCredentials: true, } ) .then((res) => { console.log("YESSIR"); setLoading(false); }); };
验证排查方法
修改代码前可在Django视图中打印request.body查看原始请求数据,确认参数已正常传递,再对应调整解析逻辑即可。
内容的提问来源于stack exchange,提问作者clerkvector112
相关产品推荐
相关产品推荐

