Ajax无法从Django后端获得成功响应

时间:2020-09-20 09:58:16

标签: javascript jquery django ajax django-views

我正在尝试以下要求,其中有一个语音合成器,它将语音(这是一个问题)转换为文本,然后通过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”的值。

2 个答案:

答案 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 }}'
  },
相关问题