使用Axios向Django发送POST请求时request.POST为空如何解决?
嘿,我太懂你这种切换工具踩坑的感觉了!刚帮你理清楚问题所在——你这是撞上了Django处理POST数据的格式匹配规则啦!
问题根源
你在Axios里设置了content-type: application/json,所以发送的是JSON格式的请求体,但Django的request.POST只负责解析表单编码(application/x-www-form-urlencoded)或者multipart/form-data类型的数据。JSON格式的数据会直接存在request.body里,自然request.POST就会是空的QueryDict了。
两种实用解决方案
方案1:让Axios发送表单编码数据(适配Django默认的request.POST)
把请求数据改成表单格式,甚至不用手动设置content-type——Axios会自动帮你处理:
const formData = new URLSearchParams(); formData.append('tes1', 'test'); formData.append('tes2', 'test'); axios({ method: 'post', url: SITE_DOMAIN_NAME + '/my_url_name/', data: formData, headers: { "X-CSRFToken": CSRF_TOKEN // 这里不用手动加content-type,Axios会自动设为application/x-www-form-urlencoded } }).then(response => { // 处理响应 })
这么改完之后,Django的request.POST就能正常拿到tes1和tes2的值了。
方案2:在Django视图里直接解析JSON请求体
如果更想保持前后端JSON交互的模式(这也是React项目里常用的方式),那就在视图里手动解析request.body:
import json from django.http import JsonResponse def my_view(request): if request.method == 'POST': # 解析JSON格式的请求体 data = json.loads(request.body) tes1 = data.get('tes1') tes2 = data.get('tes2') # 你的业务逻辑处理 return JsonResponse({'status': 'success', 'data': {'tes1': tes1, 'tes2': tes2}})
要是你用的是Django 3.1及以上版本,还能更省事——直接用request.json属性就能拿到解析好的数据:
data = request.json tes1 = data.get('tes1')
内容的提问来源于stack exchange,提问作者Horai Nuri
相关产品推荐
相关产品推荐

