我正在尝试以下要求,其中有一个语音合成器,它将语音(这是一个问题)转换为文本,然后通过Ajax将文本发送到后端Django。
在后端,Django获取该数据并使用该数据(问题)来访问数据库并获取结果,并将该结果发送到前端,该前端应被Ajax的成功部分捕获。但这不起作用。
我无法确定问题出在哪里。我将在下面发布Ajax和Django代码,供您参考。
views.py
def GetAnswer(request):
if request.method=='GET' and request.is_ajax():
question_asked=str(request.GET.get("message_now"))
try:
answer=QuestionAnswer.objects.filter(question=question_asked).value_list('answer', flat=True)[0]
print(answer)
data={"data":answer}
return JsonResponse({"success": True}, data, status=200)
except:
return JsonResponse({"success": False}, status=400)
else:
print("Not Suceess")
main.js
function chatbotvoice(message) {
const speech = new SpeechSynthesisUtterance();
if (message !== null && message !== '') {
$.ajax({
url: "http://127.0.0.1:8000/getanswer",
type: 'GET',
data: {
message_now: message
},
success: function (data) {
speech.text = JSON.parse(data);
window.speechSynthesis.speak(speech);
chatareamain.appendChild(showchatbotmsg(speech.text));
},
error: function (error) {
speech.text = "Oh No!! I don't Know !! I am still learning!! Your question got recorded and answer for your question will be available with me in 24 hours";
window.speechSynthesis.speak(speech);
chatareamain.appendChild(showchatbotmsg(speech.text));
},
});
}
}
我试图检查Ajax请求是否已到达该函数,并且能够在后端查看变量“ question_asked”的值。
答案 0 :(得分:0)
return JsonResponse({"success": True}, data, status=200)
该行将失败,并显示一些错误消息,因为您将数据作为第二个位置参数传递。 Django文档告诉您第二个位置参数是encoder
。由于包含数据的列表不是编码器-您会收到错误消息。
您的错误将被try / except块捕获。因此执行流程将移至except
块-返回{"success": false}
JSON响应。
因此您的代码应如下所示:
def GetAnswer(request):
if request.method=='GET' and request.is_ajax():
question_asked=str(request.GET.get("message_now"))
try:
answer=QuestionAnswer.objects.filter(question=question_asked).value_list('answer', flat=True)[0]
print(answer)
data={"data":answer}
return JsonResponse({"success": True, "data": data}, status=200)
except:
return JsonResponse({"success": False}, status=400)
else:
print("Not Suceess")
请参阅文档的此部分以获取更多详细信息https://docs.djangoproject.com/en/3.1/ref/request-response/#jsonresponse-objects
更新(2020年9月21日)
您应修复此行:
answer=QuestionAnswer.objects.filter(question=question_asked).value_list('answer', flat=True)[0]
到
answer=QuestionAnswer.objects.filter(question=question_asked).values_list('answer', flat=True)[0]
因为没有value_list
函数,但是有values_list
。
更新2(21.09.2020)
因此,最终代码应为:
def GetAnswer(request):
if request.method == 'GET' and request.is_ajax():
question_asked = request.GET["message_now"]
try:
answer = QuestionAnswer.objects.filter(question=question_asked).values_list('answer', flat=True)[0]
return JsonResponse({"success": True, "answer": answer}, status=200)
except:
return JsonResponse({"success": False}, status=400)
也应修改JS代码
function chatbotvoice(message) {
const speech = new SpeechSynthesisUtterance();
if (message !== null && message !== '') {
$.ajax({
url: "http://127.0.0.1:8000/getanswer",
type: 'GET',
data: {
message_now: message
},
success: function (data) {
if (data.success == true){
speech.text = data.answer;
window.speechSynthesis.speak(speech);
chatareamain.appendChild(showchatbotmsg(speech.text));
} else {
speech.text = "Oh No!! I don't Know !! I am still learning!! Your question got recorded and answer for your question will be available with me in 24 hours";
window.speechSynthesis.speak(speech);
chatareamain.appendChild(showchatbotmsg(speech.text));
}
},
error: function (error) {
speech.text = "Oh No!! I don't Know !! I am still learning!! Your question got recorded and answer for your question will be available with me in 24 hours";
window.speechSynthesis.speak(speech);
chatareamain.appendChild(showchatbotmsg(speech.text));
},
});
}
}
答案 1 :(得分:0)
$.ajax({
crossDomain: true,
url: "{% url 'getanswer' %}",
type: 'GET',
data: {
message_now: message,
'csrfmiddlewaretoken': '{{ csrf_token }}'
},