使用Axios向Django后端POST字符串数据但后端接收为空的问题求助
使用Axios向Django后端POST字符串数据但后端接收为空的问题求助
嘿,我来帮你搞定这个问题!从你贴的代码和日志来看,主要有两个小问题导致后端拿到空数据,咱们一步步来修复:
第一个问题:误处理了浏览器的OPTIONS预检请求
你日志里的OPTIONS /chatbot/rest_handler是浏览器发送的跨域预检请求,这个请求本身没有请求体,而你的视图没有判断请求方法,直接处理了这个OPTIONS请求,所以你看到的空QUESTION:其实是这个预检请求的输出,不是你实际发送的POST请求的内容。
第二个问题:后端解析JSON数据的方式不对
你的前端已经正确设置了Content-Type: application/json并发送了JSON格式的数据,但后端直接对request.bodydecode后就打印,没有把JSON字符串解析成字典来提取question字段。
现在给你修改后的代码:
后端Django视图修改:
from django.http import JsonResponse import json @csrf_exempt def rest_handler(request): # 只处理POST请求,跳过OPTIONS预检请求 if request.method != 'POST': return JsonResponse({}, status=200) print("REQUEST IS SENT FROM FRONTEND") try: # 把请求体的JSON字符串解析成Python字典 req_data = json.loads(request.body) # 提取question字段,默认空字符串防止KeyError q_info = req_data.get('question', '') print(f"QUESTION: {q_info}") except json.JSONDecodeError: print("ERROR: 无法解析请求的JSON数据") q_info = "" # 这里别返回request,返回你需要的响应内容,比如收到的问题 return JsonResponse({'received_question': q_info})
前端代码确认:
你的前端Axios配置和发送逻辑是对的,不过可以再检查下API_URL是否和后端服务的地址一致,避免跨域配置出问题。如果是跨域场景,建议给Django装个django-cors-headers包来统一处理CORS,比自己写视图处理OPTIONS更靠谱。
最后说下日志的问题:
修改后你再看日志,会先看到OPTIONS请求的200记录,然后会出现POST请求的记录,这时候QUESTION:后面就会显示你前端发送的字符串了!
内容来源于stack exchange
相关产品推荐
相关产品推荐

